卢卡斯定理

Lucas定理是用于处理组合数取模的定理,通常用于解决阶乘无法解决的问题。

本质上来说,卢卡斯定理是一类处理当组合数 Cnmmodpn,m,p 皆为 105 范围内的数时求解答案的方法。

n,m,p 较小的时候可以考虑使用杨辉三角递推得到,但是此时用这种方法显然不能很好的解决此问题,所以我们考虑寻找一种更优的方法来减少运算,使得运算的难度降低。

首先给出卢卡斯定理

Cnmmodp=Cn/pm/pCnmodpmmodpmodp

证明


n=ap+b,m=cp+d(b,d<p,a=np,c=mp)

首先,由费马小定理得,对于任意整数:(1+x)p1+x1+xp(modp) (1+x)n=(1+x)np×p×(1+x)b

i=0npCnpiXpi×k=0bCbk×Xk

观察 Xm 这一项 pi+k=m

LHS=Cnm

RHS=Cnpi×Cbk=Cnpmp×Cbd

故可以推出

Cnmmodp=Cn/pm/pCnmodpmmodpmodp

证毕。


inline int qpow(int a,int b){
    int res=1;
    while(b){
    	if(b&1){
    		res*=a,res%=p;
		}
		a*=a,a%=p;
		b>>=1;
	}
    return res;
}
inline int C(int n,int m){
	if(n < m) return 0;
	if(m > n - m) m = n - m;
	int a = 1 , b = 1;
	for(int i=0;i<m;i++){
		a = (a * (n - i)) % p;
		b = (b * (i + 1)) % p;
	}
	return a * qpow(b,p-2) % p;
}
inline int Lucas(int n,int m){
	if(m == 0) return 1;
	return Lucas(n/p,m/p) * C(n % p , m % p) % p;
}
posted @   0xFF_qwq  阅读(91)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
点击右上角即可分享
微信分享提示