我正在尝试找到一个固定n的前r个二项式系数之和。
(nC1 + nC2 + nC3 + ... + nCr) % M
其中 r ≤ n。
是否有一种有效的算法来解决这个问题?
(nC1 + nC2 + nC3 + ... + nCr) % M
其中 r ≤ n。
是否有一种有效的算法来解决这个问题?
nC0 + nC1 + ... + nC(r-1)
,模M。与其通过减少n来减少nCk
的计算,减少k更有意义:我们需要nC(k-1)
作为总和的一部分;此外,我们可能会发现r远小于n,因此通过递增n来获取值可能要比通过递增r更低效。nC0 + ... + nC(r-1) = 2^n - (nCr + ... + nCn) = 2^n - (nC0 + ... + nC(n-r))
其中n-r < n/2,因此我们已将问题减少到r <= n/2的情况下。nCk = n!/(k!(n-k)!) = n!/((k-1)!(n-(k-1)!) x (n-k+1)/k = nC(k-1) x (n-k+1)/k
按顺序计算总和的项。如果我们的整数大小不受限制,我们可以计算
sum = 0;
nCi = 1; // i=0
for i = 1 to r-1
sum += nCi;
nCi *= (n-k+1);
nCi /= k;
sum %= M;
n
,“第一个”二项式系数为nC0
。
令f(n) = nC0 + nC1 + ... + nC(r-1)
。
使用“帕斯卡三角形”恒等式,nCk = (n-1)C(k-1) + (n-1)Ck
我们有
nC0 + nC1 + nC2 + ... + nC(r-1) = (n-1)C(-1) + (n-1)C0 + (n-1)C0 + (n-1)C1 + (n-1)C1 + (n-1)C2 + ... + (n-1)C(r-2) + (n-1)C(r-1) = 2[(n-1)C0 + (n-1)C1 + (n-1)C2 + ... + (n-1)C(r-2)] + (n-1)C(r-1) = 2[(n-1)C0 + ... + (n-1)C(r-1)] - (n-1)C(r-1),即,
f(n) = 2f(n-1) - (n-1)C(r-1)
因此,每个总和都可以通过将前一个加倍并减去(n-1)C(r-1)
来计算。
例如,如果r=3
,则
f(0) = 1, f(1) = 1 + 1 = 2 = 2f(0) - 0C2, f(2) = 1 + 2 + 1 = 4 = 2f(1) - 1C2, f(3) = 1 + 3 + 3 = 7 = 2f(2) - 2C2, f(4) = 1 + 4 + 6 = 11 = 2f(3) - 3C2, f(5) = 1 + 5 + 10 = 16 = 2f(4) - 4C2,等等。
(n-1)C(r-1) mod m
。如果 m
是质数,则二项式系数 mod m
呈循环形式,循环长度为 m^k
(m
的幂大于 r-1
)。如果 m
是质数的幂,则结果会更加复杂。(请参见http://www.dms.umontreal.ca/~andrew/PDF/BinCoeff.pdf)。如果 m
有多个质因子,则可以使用中国剩余定理将计算缩减到前面的情况。nC0
、nC1
、nC2
、...、nCr
模 M
的值并将它们相加再对 M
取模呢?为什么要费力去定义和使用 f(n)
呢? - Matt