%生成二项式系数的mod兼容方式

%mod compatible ways of generating Binomial Coefficients

本文关键字:mod 方式 二项式      更新时间:2023-10-16

我想优化我的程序的一部分,在该部分中,我正在计算最高为K的二项式系数的总和,即

C(N,0) + C(N,1) + ... + C(N,K)

由于这些值超出了数据类型(long-long)所能支持的范围,我将计算mod M的值,并正在寻找实现这一点的过程

目前,我已经用Pascal的三角形完成了这项工作,但它似乎需要一些负载。所以,我想知道是否还有其他有效的方法可以做到这一点。我考虑过Lucas定理,虽然M已经足够大了,所以C(N,k)已经失控了

任何关于我如何以不同的方式做到这一点的指针,也许可以用其他一些简洁的总和表达式来计算整个总和。如果没有,我将把它留给Pascal三角法本身

谢谢你,

以下是我目前拥有的O(N^2):

#define MAX 1000000007
long long NChooseK_Sum(int N, int K){
    vector<long long> prevV, V;
    prevV.push_back(1);     prevV.push_back(1);
    for(int i=2;i<=N;++i){
            V.clear();
            V.push_back(1);
            for(int j=0;j<(i-1);++j){
                    long long val = prevV[j] + prevV[j+1];
                    if(val >= MAX)
                            val %= MAX;
                    V.push_back(val);
            }
            V.push_back(1);
            prevV = V;
    }
    long long res=0;
    for(int i=0;i<=K;++i){
            res+=V[i];
            if(res >= MAX)
                    res %= MAX;
    }
    return res;
}

执行线性算术bignum运算的算法是

def binom(n):
    nck = 1
    for k in range(n + 1):  # 0..n
        yield nck
        nck = (nck * (n - k)) / (k + 1)

这使用除法,但对素数p取模,你可以通过乘以方程i * (k + 1) = 1 mod p的解i来完成大致相同的事情。值i可以通过扩展欧几里得算法在对数算术运算中找到。