卢卡斯定理模板题
当p为质数时,C(N,M)=C(N%P,M%P)*C(N/P,M/P);
我也不会证明- -
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=1e5+10; ll p,a[maxn*2+10]; ll q_m(ll a,ll b){ a%=p;ll ret=1; while(b>0){ if(b&1){ ret=(ret*a)%p; } a=(a*a)%p; b>>=1; } return ret; } ll c(int n,int m){ if(m>n)return 0; return a[n]*q_m(a[n-m],p-2)*q_m(a[m],p-2)%p; } ll lucas(ll n,ll m){ if(!m)return 1; return c(n%p,m%p)*lucas(n/p,m/p)%p; } int main(){ int T; scanf("%d",&T); while(T--){ ll n,m; scanf("%lld%lld%lld",&n,&m,&p); a[0]=1; n+=m; for(int i=1;i<=n;++i){ a[i]=(a[i-1]*i)%p; } printf("%lld\n",lucas(n,m)%p); } return 0; }