原题链接:P3807 【模板】卢卡斯定理/Lucas 定理 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
题解代码:
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
const int N=1e5+5;
int n,m,p,a[N],b[N];
void qwq()
{
a[0]=b[0]=a[1]=b[1]=1;
for(int i=2;i<=p;i++) b[i]=-1ll*(p/i)*b[p%i]%p;
for(int i=2;i<=p;i++)
{
a[i]=i*a[i-1]%p;
b[i]=b[i-1]*b[i]%p;
}
}
int C(int n,int m,int p)
{
if(m>n) return 0;
return a[n]*b[n-m]%p*b[m]%p;
}
int Lucas(int n,int m,int p)
{
if(!m) return 1;
return C(n%p,m%p,p)*Lucas(n/p,m/p,p)%p;
}
void solve()
{
cin>>n>>m>>p;
n+=m;
qwq();
cout<<(Lucas(n,m,p)+p)%p<<endl;
}
signed main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int T;
cin>>T;
while(T--) solve();
return 0;
}