1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| #include <iostream> #include <cstdio> #include <algorithm> #include <cmath> #include <cstring> using namespace std;
typedef long long lld; lld n, m, p;
lld Ext_gcd(lld a,lld b,lld &x,lld &y){ if(b==0) { x=1, y=0; return a; } lld ret= Ext_gcd(b,a%b,y,x); y-= a/b*x; return ret; } lld Inv(lld a,int m){ lld d,x,y,t= (lld)m; d= Ext_gcd(a,t,x,y); if(d==1) return (x%t+t)%t; return -1; }
lld Cm(lld n, lld m, lld p) { lld a=1, b=1; if(m>n) return 0; while(m) { a=(a*n)%p; b=(b*m)%p; m--; n--; } return (lld)a*Inv(b,p)%p; }
int Lucas(lld n, lld m, lld p) { if(m==0) return 1; return (lld)Cm(n%p,m%p,p)*(lld)Lucas(n/p,m/p,p)%p; }
int main() { int T; cin >> T; while(T--) { scanf("%lld%lld%lld",&n,&m,&p); printf("%d\n",Lucas(n+m,m,p)); } return 0; }
|