对组合数求模 需要用到逆元
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
__int64 Ext_gcd(__int64 a,__int64 b,__int64 &x,__int64 &y){
if(b==0) { x=1, y=0; return a; }
__int64 res= Ext_gcd(b,a%b,y,x);
y-= a/b*x;
return res;
}
__int64 Inv(__int64 a,__int64 m){
__int64 d,x,y;
d= Ext_gcd(a,m,x,y);
if(d==1) return (x%m+m)%m;
return -1;
}
__int64 C(__int64 n,__int64 m,__int64 mod) //组合数公式
{
__int64 sum1=1;
for(__int64 i=n-m+1; i<=n; ++i)
sum1= sum1*i%mod;
__int64 sum2= 1;
for(__int64 i=1; i<=m; ++i)
sum2= sum2*i%mod;
// printf("%d %d %d \n",sum1,sum2,Inv( 2, 57));
__int64 ans= sum1 * Inv( sum2, mod ) %mod;
return ans;
}
int main()
{
__int64 m,n,p,T;
scanf("%I64d",&T);
while(T--)
{
scanf("%I64d%I64d%I64d",&n,&m,&p);
printf("%I64d\n",C(n,m,p));
}
return 0;
}