Lucas 定理 [证明][模板]

本文深入探讨了Lucas定理,一种用于高效计算组合数的重要数学工具,尤其是在处理大数模意义下的组合数时。通过详细的证明过程和C++代码实现,读者将了解到如何利用Lucas定理解决相关问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Lucas 定理

\LARGE C_n^m\equiv C_{i}^{j} * C_{a}^{b}(mod p)

其中 i = n/p , j = m/p , a = n % p , b = m % p


证明

令n = (\small a_ka_k-1...a_1a_0)p

首先有

(x+1)^p\equiv \sum _{k=0}^pC_p^kx^k\equiv 1+x^p(modp)

所以

(x+1)^n\equiv (x+1)^{pi}(x+1)^{a}\equiv (1+x^p)^i(x+1)^a\equiv [\sum_{k=0}^iC_{i}^kx^{pk}][\sum_{l=0}^{a}C_a^lx^l]

对于左边的第m位的系数 , 即x^m 的系数 是C(n,m)

而对于右边 , x^m 的系数 是   C_{i}^k*C_{a}^{l}(pk+l=m)  ,  即k = m/p , l = m%p

证毕


模板题

#include<bits/stdc++.h>
#define N 200050
#define LL long long
using namespace std;
LL T,n,m,p; LL fac[N],inv[N];
LL power(LL a,LL b,LL mod){
	LL ans=1; for(;b;b>>=1){ if(b&1) ans=(ans*a) % p; a = (a*a) % p;} return ans;  
}
LL C(LL a,LL b,LL mod){
	if(b>a) return 0;
	return ((fac[a] * power(fac[a-b], mod-2, mod)) % mod * power(fac[b], mod-2, mod)) % mod;
}
LL Lucas(LL x,LL y,LL mod){
	if(y==0) return 1;
	if(x<mod && y<mod) return C(x,y,mod);
	else return (Lucas(x/mod,y/mod,mod) * C(x%mod,y%mod,mod)) % mod;
}
void Solve(){
	scanf("%d%d%d",&n,&m,&p);
	fac[0] = fac[1] = 1;
	for(int i=2;i<=n+m;i++) fac[i] = (fac[i-1] * i) % p;
	printf("%lld\n",Lucas(n+m,m,p));
}
int main(){
	scanf("%d",&T); while(T--) Solve(); return 0;
} 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FSYo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值