卢卡斯定理
卢卡斯(Lucas)定理
若 \(n,m\) 均为正整数且 \(n>m,p\) 为质数 ,则:
\[C(n,m)\equiv C(\frac{n}{p},\frac{m}{p})\cdot C(n\%p,m\%p)\pmod p
\]
用于求解 \(n,m\) 很大(1e18), \(p\) 较小(1e5)时的组合数,对于后半部分直接使用公式( \(C(n,m)=n!/m!(n-m)!\) )求解,对于前半部分递归进行求解。
代码:
ll Lucas(int n,int m,int p)
{
if(n<m) return 0;
if(n<p&&m<p) return Fac[n]*Inv[m]%p*Inv[n-m]%p;
//注意这里n与m可能等于0,因此Inv[0]与Fac[0]都需赋为1
return Lucas(n/p,m/p,p)*Lucas(n%p,m%p,p)%p;
}
附:Lucas定理的证明:
- 若 \(x,p\in \N^+\) 满足 \(x<p\) ,则有:
\[C(p,x)=p/x\cdot C(p-1,x-1)
\]
- 由1可得:
\[C(p,x) \equiv p\cdot x^{-1}\cdot C(p-1,x-1) \pmod p
\]
同余式为 \(p\) 的倍数,模 \(p\) 余 \(0\) ,因此:
\[C(p,x)\equiv 0 \pmod p
\]
- 根据二项式定理:
\[(x+1)^p=\sum\limits_{i=0}^p C(p,i)\cdot x^i
\]
由2可得,所有项中除 \(i=0\) 与 \(i=p\) 除外,均为 \(p\) 的倍数,因此有:
\[(x+1)^p\equiv 1+x^p\pmod p
\]
- 若 \(m\in \N^+\) 且 \(m>p\) ,设 \(m=q_m\cdot p +r_m\) ,则:
\[(x+1)^m=(x+1)^{q_m\cdot p+r_m}=[(x+1)^p]^{q_m}\cdot (x+1)^{r_m}
\]
\[[(x+1)^p]^{q_m}\cdot (x+1)^{r_m}\equiv (x^p+1)^{q_m}\cdot (x+1)^{r_m}\pmod p
\]
\[(x^p+1)^{q_m}\cdot (x+1)^{r_m}=(\sum\limits_{i=1}^{q_m}C(q_m,i)\cdot x^{p\cdot i})\cdot (\sum\limits_{j=1}^{r_m}C(r_m,j)\cdot x^j)=\sum\limits_{i=1}^{q_m}\sum\limits_{j=1}^{r_m}C(q_m,i)\cdot C(m,j)\cdot x^{p\cdot i +j}
\]
- 令 \(k=i\cdot p+j\) ,则有:
\[(x+1)^m\equiv \sum\limits_{k=0}^m C(q_m,k/p)\cdot C(r_m,k\%p)\cdot x^k \pmod p
\]
\[\sum\limits_{k=0}^{m}C(m,k)\cdot x^k\equiv \sum\limits_{k=0}^mC(q_m,k/p)\cdot C(r_m,k\%p)\cdot x^k\pmod p
\]
将 \(q_m\) 与 \(r_m\) 代入,消掉相同项,得:
\[C(m,k)\equiv C(m/p,k/p)\cdot C(m\%p,k\%p)\pmod p
\]
\(QED.\)

浙公网安备 33010602011771号