关于组合数取模

本文探讨了组合数取模的计算方法,包括当n和m较小,可以用杨辉三角递推式解决;n和m较大且p为素数时,利用Lucas定理;当p不是素数时,借助中国剩余定理。详细阐述了每种情况下的计算步骤和技巧,如使用递归和周期性计算减少复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于组合数取模

对于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=nkpk+nk1pk1+...+n1p1+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=mkpk+mk1pk1+...+m1p1+m0
那么有
Cmn≡∏i=0kCmini(modp)C_{m}^{n}\equiv\prod_{i=0}^{k}C_{m_i}^{n_i} \pmod pCmni=0kCmini(modp)要证明Lucas定理,首先证明 Cpx≡0(modp)C_{p}^{x} \equiv 0 \pmod{p} Cpx0(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!(px)!p!modp=xp(x1)!(px)!(p1)!modp=

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值