1.组合数取膜(Lucas定理)
求 C n m % p , 其 中 1 ≤ p ≤ 1 0 9 , 并 且 p 是 素 数 求 C_{n}^{m} % p,其中1leq p leq 10^{9}, 并且p是素数 求Cnm%p,其中1≤p≤109,并且p是素数
#include#include using namespace std; #define ll long long ll n,m,p; ll pow_m(ll a,ll k,ll p) { ll ans=1; ll tmp=a%p; while(k) { if(k&1)ans=ans*tmp%p; tmp=tmp*tmp%p; k>>=1; } return ans; } ll C(ll n,ll m,ll p) { if(m>n)return 0; ll a=1,b=1; for(int i=1;i<=m;i++) { a=a*(n+i-m)%p; b=b*i%p; } return a*pow_m(b,p-2,p)%p; } ll Lucas(ll n,ll m,ll p) { ll ans=1; while(n&&m) { ans=ans*C(n%p,m%p,p)%p; n/=p; m/=p; } return ans; } int main() { int T; scanf("%d",&T); while(T--) { scanf("%d%d%d",&n,&m,&p); printf("%lldn",Lucas(n,m,p)); } return 0; }



