lucas定理

题目:https://www.luogu.org/problemnew/show/P3807

题解:https://www.luogu.org/problemnew/solution/P3807

 

#include<bits/stdc++.h>
using namespace std;
int p;
long long jc[100004];
inline long long pow(long long a,int b){
    long long ans=1;
    while(b){
        if(b&1) ans=(ans*a)%p;
        a=(a*a)%p;
        b>>=1;
    }
    return ans;
}
inline long long C(long long n,long long m){
    if(m>n) return 0;
    return (jc[n]*pow(jc[m],p-2))%p*pow(jc[n-m],p-2)%p;
}
inline long long lucas(long long n,long long 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--){
        int n,m;scanf("%d%d%d",&n,&m,&p);
        jc[0]=1;
        for(int i=1;i<=p;i++) jc[i]=(jc[i-1]*i)%p;
        printf("%d\n",lucas(n+m,min(n,m)));
    }
}

 

posted @ 2019-01-11 14:02  WiFiMonster  阅读(98)  评论(0编辑  收藏  举报