lucas 对组合数取模
lucas(n,m)=C(n%mod,m%mod)*lucas(n/mod,m/mod)%mod;
lucas(n,0)=1;
#include<iostream>
#include<cstdio>
using namespace std;
__int64 jc[100010];
__int64 exgcd(__int64 a,__int64 b,__int64 &x,__int64 &y){
if(b==0) return x=1,y=0,a;
__int64 res=exgcd(b,a%b,y,x);
y-=a/b*x;
return res;
}
__int64 Inv(__int64 a,__int64 mod){
__int64 x,y;
exgcd(a,mod,x,y);
return (x%mod+mod)%mod;
}
__int64 C(__int64 n,__int64 m,__int64 mod){
if(m>n) return 0;
__int64 ret= jc[n];
ret*= Inv((jc[m]*jc[n-m])%mod,mod);
return ret%mod;
}
__int64 Lucas(__int64 n,__int64 m,__int64 mod){
if(m==0) return 1;
return C(n%mod,m%mod,mod)*Lucas(n/mod,m/mod,mod)%mod;
}
int main()
{
int i,j,k,N,M,n,mod,T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&N,&M,&mod);
for(jc[0]=1,i=1;i<=mod;i++) jc[i]=jc[i-1]*i%mod;
printf("%I64d\n",Lucas(N+M,N,mod));
}
return 0;
}