微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

素数的二项式系数模平方

如何解决素数的二项式系数模平方

计算二项式系数:\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 举报,一经查实,本站将立刻删除。