卢卡斯定理

1.卢卡斯定理用于求解大组合数取模的问题,其中模数必须为素数。
2.卢卡斯定理的具体表述:

Cnm=Ca0b0Ca1b1Ca2b2.....Cakbk(modp)=i=0kCaibi(modp);

(mod p)表示只在模p的条件下成立
这个式子又等价于

Cnm=Cn%pm%pCn/pm/p(modp);

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

练习题
P3807 【模板】卢卡斯定理/Lucas 定理
D - Bouquet

posted on   swj2529411658  阅读(32)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示