问题:求$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 | ll get(ll n,ll m) |