Lucas 定理学习笔记
一、定理
给定
这题可以用 Lucas 定理求解。
Lucas 定理:
当
要证明这个结论,要先证明一个引理:
当
为什么?我们知道,
或 此时分母也有 1 个 ,并且 。 ,此时分母没有质因数 ,所以此时 。
然后我们用二项式定理拆开:
这样,引理就证完了。
然后就是 Lucas 定理了。
我们知道,
假设
那么
然后考虑
所以就知道
也就是
时间复杂度:预处理
二、代码
inline void exgcd(ll &x,ll &y,ll a,ll b){
if(!b){x=1;y=0;return;}
exgcd(y,x,b,a%b);y-=a/b*x;
}
inline ll lucas(ll x,ll y){
if(x<y)return 0;
if(x<p)return a[x]*b[y]*b[x-y]%p;
return lucas(x/p,y/p)*lucas(x%p,y%p)%p;
}
int main(){
cin>>t;a[0]=b[0]=a[1]=b[1]=1;
while(t--){
cin>>n>>m>>p;
for(ll i=2;i<p;i++)a[i]=a[i-1]*i%p;
for(ll i=2;i<p;i++)b[i]=(p-p/i)*b[p%i]%p;
for(ll i=2;i<p;i++)b[i]=b[i-1]*b[i]%p;
cout<<lucas(n+m,n)<<'\n';
}
return 0;
}
三、推论
证明:假设
那么反复使用 Lucas 定理,知
然后如果存在
如果
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!