关于组合数取模
对于C(n,m) mod p (m<=n)
1、如果n,m比较,1<=m<=n<=1000,p<=1e9
可以用杨辉三角递推式去解决,用C[n][m]来储存C(n,m)的值,则递推式为:
C[i][j] mod p=(C[i-1][j-1]+C[i-1][j]) mod p(1<=j<=i) C[i][0]=1
2、如果n,m较大(1<=m<=n<=1e18)且p是素数
可以用Lucas定理去解决。
Lucas定理的定义:
如果有两个数n,m可以表示为
n=nk∗pk+nk−1∗pk−1+...+n1∗p1+n0n=n_k*p^k+n_{k-1}*p^{k-1}+...+n_1*p^1+n_0n=nk∗pk+nk−1∗pk−1+...+n1∗p1+n0
m=mk∗pk+mk−1∗pk−1+...+m1∗p1+m0m=m_k*p^k+m_{k-1}*p^{k-1}+...+m_1*p^1+m_0m=mk∗pk+mk−1∗pk−1+...+m1∗p1+m0
那么有
Cmn≡∏i=0kCmini(modp)C_{m}^{n}\equiv\prod_{i=0}^{k}C_{m_i}^{n_i} \pmod pCmn≡i=0∏kCmini(modp)要证明Lucas定理,首先证明 Cpx≡0(modp)C_{p}^{x} \equiv 0 \pmod{p} Cpx≡0(modp)
证:
Cpx mod p=p!x!(p−x)! mod p=px∗(p−1)!(x−1)!(p−x)! mod p=p∗inv(x)∗Cp−1x−1 mod pC_{p}^{x}\bmod p=\frac{p!}{x!(p-x)!}\bmod p=\frac{p}{x}*\frac{(p-1)!}{(x-1)!(p-x)!}\bmod p=p*inv(x)*C_{p-1}^{x-1}\bmod p Cpxmodp=x!(p−x)!p!modp=xp∗(x−1)!(p−x)!(p−1)!modp=