如何解决素数的二项式系数模平方
计算二项式系数:\binom{852 467 439}{426} (nCk) modulo 289
我使用过这个文档:https://web.archive.org/web/20170202003812/http://www.dms.umontreal.ca/~andrew/PDF/BinCoeff.pdf
int VpnCk(int n,int k,int p){
int res = 0,t = p;
while (n > t){
res += (n/t - k/t - (n-k)/t);
t *= p;
if (res == 2) break;
}
return res;
}
所以 nCk 除以 17,但除以 289
使用 vector 得到以 17 为基数的 N、K、N-K 的表示。
vector<unsigned long long> getRepresentation(unsigned long long N,int mod) {
vector<unsigned long long> res;
while (N > 0) {
res.push_back(N % mod);
N /= mod;
}
return res;
}
...
int main(){
...
n17.resize(n17.size()+1);
k17.resize(n17.size()); r17.resize(n17.size());
}
N:8 5 10 10 6 5 1 2 0
K:1 8 1 0 0 0 0 0 0
N-K:7 14 8 10 6 5 1 2 0
定义:
N = n_0 + 17 * n_1 + ... + 17^d * n_d(n_i 的值已列出)
N_i = n_i + 17 * n_{i+1} (i=0,d)
所以,(N_i)!/(K_i)!(R_i)!模 289 是: 1 42 141 1 1 1 1 1 还有
unsigned long long C289(unsigned long long N,unsigned long long K,unsigned long long R){
if (K > N) {
return 1;
}
return (((fact17[N] * binpow(fact17[R],271,289)) % 289) * binpow(fact17[K],289)) % 289;
}
int v17 = VpnCk(N,K,17);
if (VpnCk(N,17) == 2) res3 = 0;
else {
for (unsigned long long i = 0; i <= k17.size()-2; ++i){
res3 = (res3 * C289(n17[i+1]*17 + n17[i],k17[i+1]*17 + k17[i],r17[i+1]*17 + r17[i])) % 289;
}
if (v17 == 1) res3 = (res3*17) % 289;
}
cout << res3;
我的答案是 102,但正确答案是 238。我的代码有什么问题
P/s:我可以在 stackoverflow 上使用 Latex 吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。