2025-01-24 12:08阅读: 9评论: 0推荐: 0

Lucas 定理简单证明

前言

Oi wiki 和网上博客的证明都没完全看懂,最后还是自己推出来的。。这里记录一下思路。

Lucas 定理

对于质数 p(nm)modp=(n/pm/p)(nmodpmmodp)modp
可以接着递归展开 (n/pm/p),把所有组合数中系数降到 p1。展开后有时可以视作一个 p1 进制数,为数位DP提供可能性。

朴素的Lucas 定理可以加速大组合数对质数取模的运算。

证明Lucas 定理

二项式定理

对于 x,yR,nN,有:

(x+y)n=i=0n(ni)xiyni

引理 1

(pn)modp=[n=0n=p]

证明引理 1

(pn)=p!n!(pn)!,分子中有有一个因子 p,若不消去这个因子那么原式为 0;消去这个因子当且仅当 p=np=pn,即 p=nn=0,此时原式为 10!,根据定义等于 1。得证。

引理 2

(a+b)pap+bp(modp)

证明引理 2

先二项式定理展开有

(a+b)pn=0p(pn)anbpn(modp)

由引理 1,上式只有 n=0n=p 时有值,即

ap+bp(modp)

证明Lucas 定理

不妨把 (nm)modp 看做是 (1+x)nmodpxm 项的系数。

n=pn/p+nmodp 先把指数拆成两部分

(1+x)nmodp=(1+x)pn/p(1+x)nmodpmodp

由引理 2,(1+x)pn/p=(1+xp)n/p,即

(1+xp)n/p(1+x)nmodpmodp

再二项式定理展开,有

i=0n/p(n/pi)xipj=0nmodp(nmodpj)xjmodp

那么 xm 项系数的另一种表达方式就有

i=0n/pj=0nmodpip+j=m(n/pi)(nmodpj)modp

不难验证 i=m/p,j=mmodp 是一组符合枚举范围(当nm)的方程 ip+j=m 的解。如果我们能证明这是唯一解那么就能完善证明Lucas 定理了!

考虑其它解形如 i=m/pk,j=mmodp+kp,kZ,k0 的情形。由于限制了 0jnmodp,这些解已经不成立。因为 nmodpmmodp 最大不超过 p1,而 j 要么小于 0 要么 大于 p1。这意味着 i=m/p,j=mmodp 就是其唯一的一组合法解。也就是说上式就等于

(n/pm/p)(nmodpmmodp)modp

也就得到

(nm)modp=(n/pm/p)(nmodpmmodp)modp

得证。

模板代码

就是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;
}

本文作者:Ydoc770

本文链接:https://www.cnblogs.com/Ydoc770/p/18689220

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Ydoc770  阅读(9)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起