/* Lucas theorem m = mk * p^k + mk-1 * p^k-1 +... +m1 * p + m0; n = nk * p^k + nk-1 * p^k-1 +... + n1 * p + n0; C(m,n)=C(mk,nk)*C(mk-1,nk-1)*...*C(m1,n1)*C(m0,n0); 【题目大意】 求C(n+m,n) % p的值。 保证p是素数。 */ #include <iostream> #include <cstdio> #define N 100009 #define LL long long using namespace std; LL ff[N+5]; LL M; LL gcd(LL a,LL b) { if(b==0) return a; else return gcd(b, a % b); } LL x,y; void Extended_gcd(LL a, LL b) { if(b==0) { x = 1; y = 0; } else { Extended_gcd(b, a % b); LL t = x; x = y; y = t - ( a / b ) * y; } } LL C(LL a,LL b) { if(b > a) return 0; b=( ff[a-b] * ff[b] ) % M; a= ff[a]; LL c=gcd(a,b); a /= c; b /= c; Extended_gcd(b, M); x = ( x + M ) % M; x = ( x * a ) % M; return x; } LL func(LL n, LL m) //Lucas定理 { LL ans = 1; LL a, b; while(m || n) { a = n % M; b = m % M; n /= M; m /= M; ans=(ans * C (a , b) ) % M; } return ans; } int main() { LL n, m, k; int t; scanf("%d", &t); while(t--){ scanf("%I64d %I64d %I64d", &n, &m, &M); ff[0]=1; for(int i=1;i<=M;i++) ff[i] = ( ff[i-1] * i ) % M; printf("%I64d/n", func(n + m, m)); } return 0; }