0%

Lucas定理

问题:求$C_n^m\mod p$,其中保证$p$为质数。

将$n,m$进行$p$进制展开:

则有

这就是Lucas定理

利用生成函数证明:

首先,易得$\forall 0< i < p,p\mid C_p^i$

$\therefore (1+x)^p\equiv 1+x^p\mod p,(1+x)^{p^i}\equiv 1+x^{p^i}\mod p$

我们的目的是证明:$\sum_{m=0}^n C_n^mx^m=\sum_{m=0}^n(\prod_{i=0}^kC_{n_i}^{m_i})x^m\mod p$

这个时候对里面的这一项再进行二项式展开:

由于当$m_i>n_i$时$C_{n_i}^{m_i}=0$,所以上面的式子可以等价地写成:

考虑这个函数的$x^{m’}$次项,由于$m’$的$p$进制展开是唯一的,所以这一项的系数一定恰好等于$\prod C_{n_i}^{m’_i}$,其中$m’_i$为$m’$的$p$进制展开。

也就是说,这个函数等于$\sum_{m=0}^n(\prod_{i=0}^kC_{n_i}^{m_i})x^m$。得证。

另外一种证明方式:设$n=kp+r,m=ap+b$,其中$r< p$,则

考虑$x^m$项的系数,左边是$C_n^m$,右边是$C_k^aC_r^b$,得证。

实现:
上面的定理可以写成:

对于左边的一部分递归至$m=0$,右边的一部分,预处理阶乘及其逆元,$n,m< p$,直接算就可以了。

1
2
3
4
5
6
7
8
9
ll get(ll n,ll m)
{
return frc[n]*Inv[m]%mod*Inv[n-m]%mod;
}
ll cal(ll n,ll m)
{
if(m==0) return 1;
return cal(n/mod,m/mod)*get(n%mod,m%mod)%mod;
}