概述:
卢卡斯定理解决了这样一个问题: 求$C^m_n\ mod\ p$, 其中$p$为质数.
这里先直接给出结论, 十分简单也十分好实现:
其中$0 \leq q,r < p$
代码实现时直接取$s = \lfloor \frac{n}{p} \rfloor$, $t = \lfloor \frac{m}{p} \rfloor$, $q = n\ mod\ p$, $r = m\ mod\ p$. 然后暴力计算$q \choose r$, 递归处理$s \choose t$即可.
1 | int fc(int n,int m,int p) { //暴力处理 |
证明:
首先证明当$0 < m < p$时, $p|{p \choose m}$:
将$p \choose m$展开, 有:
由于$m < p$, 所以分号下面的项没有质因子$p$, 而上面有. 所以$p|{p \choose m}$.
然后构造一个$(1+x)^n$, 有:
由二项式定理, 有:
将该式代入上式, 有:
左边取$x^m$, 当$0 \leq q < p$时, 右侧两个二项式只能取$x^{tp}$和$x^r$, 有:
左右消去$x^m$, 即证得卢卡斯定理: