模板
公式:Lucas(n,m)=C(n%p,m%p)*Lucas(n/p,m/p)
Lucas定理保证了求C时逆元存在
注意逆元存在条件
不会证明
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long Lint;
const int maxn=200009;
int T;
int n,m,mm;
Lint f[maxn];
Lint Ksm(Lint a,int p){
Lint ret=1;
for(;p;p>>=1,a=a*a%mm){
if(p&1)ret=ret*a%mm;
}
return ret;
}
Lint Inv(Lint x){
return Ksm(x,mm-2);
}
Lint C(int n,int m){
if(m>n)return 0;
return f[n]*Inv(f[m])*Inv(f[n-m])%mm;
}
Lint Lucas(int n,int m){
if(m==0)return 1;
return C(n%mm,m%mm)*Lucas(n/mm,m/mm)%mm;
}
int main(){
scanf("%d",&T);
while(T--){
scanf("%d%d%d",&n,&m,&mm);
n=n+m;
f[0]=1;
for(int i=1;i<=n;++i)f[i]=f[i-1]*i%mm;
printf("%lld\n",Lucas(n,m));
}
return 0;
}