卢卡斯定理

卢卡斯(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定理的证明:

  1. \(x,p\in \N^+\) 满足 \(x<p\) ,则有:

\[C(p,x)=p/x\cdot C(p-1,x-1) \]

  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 \]

  1. 根据二项式定理:

\[(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 \]

  1. \(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} \]

  1. \(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.\)

posted @ 2022-07-05 08:12  lxzy  阅读(129)  评论(0)    收藏  举报