Lucas 定理简单证明
前言
Oi wiki 和网上博客的证明都没完全看懂,最后还是自己推出来的。。这里记录一下思路。
Lucas 定理
对于质数 \(p\),$${n\choose m}\bmod p={\lfloor n/p\rfloor\choose \lfloor m/p\rfloor}\cdot{n\bmod p\choose m\bmod p}\bmod p$$
可以接着递归展开 \({\lfloor n/p\rfloor\choose \lfloor m/p\rfloor}\),把所有组合数中系数降到 \(\le p-1\)。展开后有时可以视作一个 \(p-1\) 进制数,为数位DP提供可能性。
朴素的Lucas 定理可以加速大组合数对质数取模的运算。
证明Lucas 定理
二项式定理
对于 \(x,y\in R,n\in N\),有:
引理 1
证明引理 1:
\({p\choose n}={p!\over n!(p-n)!}\),分子中有有一个因子 \(p\),若不消去这个因子那么原式为 \(0\);消去这个因子当且仅当 \(p=n\vee p=p-n\),即 \(p=n\vee n=0\),此时原式为 \({1\over 0!}\),根据定义等于 \(1\)。得证。
引理 2
证明引理 2:
先二项式定理展开有
由引理 1,上式只有 \(n=0\vee n=p\) 时有值,即
证明Lucas 定理
不妨把 \({n\choose m}\bmod p\) 看做是 \((1+x)^n\bmod p\) 在 \(x^m\) 项的系数。
由 \(n=p\lfloor n/p\rfloor+n\bmod p\) 先把指数拆成两部分
由引理 2,\((1+x)^{p\lfloor n/p\rfloor}=(1+x^p)^{\lfloor n/p\rfloor}\),即
再二项式定理展开,有
那么 \(x^m\) 项系数的另一种表达方式就有
不难验证 \(i=\lfloor m/p\rfloor,j=m\bmod p\) 是一组符合枚举范围(当\(n\ge m\))的方程 \(ip+j=m\) 的解。如果我们能证明这是唯一解那么就能完善证明Lucas 定理了!
考虑其它解形如 \(i=\lfloor m/p\rfloor-k,j=m\bmod p+kp,k\in Z,k\neq0\) 的情形。由于限制了 \(0\le j\le {n\bmod p}\),这些解已经不成立。因为 \(n\bmod p\) 和 \(m\bmod p\) 最大不超过 \(p-1\),而 \(j\) 要么小于 \(0\) 要么 大于 \(p-1\)。这意味着 \(i=\lfloor m/p\rfloor,j=m\bmod p\) 就是其唯一的一组合法解。也就是说上式就等于
也就得到
得证。
模板代码
Luogu P3807 【模板】卢卡斯定理/Lucas 定理 Link
就是Lucas 定理的模板。但是数据范围太水了,预处理下来甚至不需要Lucas 定理就能过。
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 10;
int T, n, m, p;
ll frac[maxn];
int qpow(ll x, int y) {
ll res = 1;
while(y) {
if(y & 1) (res *= x) %= p, y--;
(x *= x) %= p; y /= 2;
}
return (int)res;
}
int C(int n, int m){
return (m > n) ? 0 : frac[n] * qpow(frac[m], p - 2) % p * qpow(frac[n - m], p - 2) % p;
}
int lucas(int n, int m) {
return (m == 0) ? 1 : C(n % p, m % p) * lucas(n / p, m / p) % p;
}
void init() {
frac[0] = 1ll, frac[1] = 1ll;
for(int i = 2; i <= 100000; i++) frac[i] = 1ll*frac[i - 1] * i % p;
return;
}
int main() {
ios :: sync_with_stdio(false); cin.tie(0); cout.tie(0);
cin >> T;
while(T--) {
cin >> n >> m >> p;
init();
cout << lucas(n + m, n) << endl;
}
return 0;
}

浙公网安备 33010602011771号