卢卡斯定理
1.卢卡斯定理用于求解大组合数取模的问题,其中模数必须为素数。
2.卢卡斯定理的具体表述:
(mod p)表示只在模p的条件下成立
这个式子又等价于
3.这里不证明,因为我不会证明。
模版应用
/** - swj - * /> フ | _ _| /`ミ _x ノ / | / ヽ ? / ̄| | | | | ( ̄ヽ__ヽ_)_) \二つ **/ #include <bits/stdc++.h> #define int long long #define endl '\n' using namespace std; typedef pair<int,int> pii; #define x first #define y second #define all(v) v.begin(),v.end() #define ull unsigned long long int dx[]={0,1,0,-1}; int dy[]={1,0,-1,0}; //----卢卡斯定理-------------- //#define mod 1000000007 int n,m,mod; int qpow(int a,int n) //快速幂 { int res=1; while(n) { if(n&1) res=res*a%mod; a=a*a%mod; n>>=1; } return res; } 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))%mod; b=(b*(i+1))%mod; } return a*qpow(b,mod-2)%mod; } int lucas(int n,int m)//卢卡斯定理 { if(m==0) return 1; return lucas(n/mod,m/mod)*C(n%mod,m%mod)%mod; } //-------------------------------------- signed main() { ios::sync_with_stdio(0),cin.tie(0); int t=1;cin>>t; while(t--) { cin>>n>>m>>mod; cout<<lucas(n+m,n)<<endl; } }
posted on 2024-07-27 13:57 swj2529411658 阅读(32) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】