关于组合数取模

关于组合数取模

对于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 = n k ∗ p k + n k − 1 ∗ p k − 1 + . . . + n 1 ∗ p 1 + n 0 n=n_k*p^k+n_{k-1}*p^{k-1}+...+n_1*p^1+n_0 n=nkpk+nk1pk1+...+n1p1+n0
m = m k ∗ p k + m k − 1 ∗ p k − 1 + . . . + m 1 ∗ p 1 + m 0 m=m_k*p^k+m_{k-1}*p^{k-1}+...+m_1*p^1+m_0 m=mkpk+mk1pk1+...+m1p1+m0
那么有
C m n ≡ ∏ i = 0 k C m i n i ( m o d p ) C_{m}^{n}\equiv\prod_{i=0}^{k}C_{m_i}^{n_i} \pmod p Cmni=0kCmini(modp)要证明Lucas定理,首先证明 C p x ≡ 0 ( m o d p ) C_{p}^{x} \equiv 0 \pmod{p} Cpx0(modp)
证:
C p x   m o d   p = p ! x ! ( p − x ) !   m o d   p = p x ∗ ( p − 1 ) ! ( x − 1 ) ! ( p − x ) !   m o d   p = p ∗ i n v ( x ) ∗ C p − 1 x − 1   m o d   p C_{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)!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值