HDU - 3037:Saving Beans

#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<vector>
#define MAXN 100000+10
#define ll long long
#define pb push_back
#define ft first
#define sc second
#define mp make_pair
#define pil pair<int,ll>
using namespace std;
int n,m,p;
ll fac[MAXN],inv[MAXN],finv[MAXN];
ll Pow(ll x,ll p,ll MOD){
    ll ret=1;
    while(p){
        if(p&1){(ret*=x)%=MOD;}
        (x*=x)%=MOD;
        p>>=1;
    }
    return ret;
}
ll ni(ll x){
    return Pow(x,p-2,p);    
}
ll C(int n,int m){
    if(m>n)return 0;
    return fac[n]*ni(fac[m])*ni(fac[n-m])%p;
}
ll lucas(int n,int m){

    ll ret=1;
    while(n>=p||m>=p){
        if(!m)return ret;
        int t1=n%p,t2=m%p;
        if(t1<t2)return 0;
        (ret*=C(t1,t2))%=p;
        n/=p,m/=p;    
    }
    return ret*C(n,m)%p;
}
void solve(){
    scanf("%d%d%d",&n,&m,&p);
    fac[0]=fac[1]=1;
//    finv[0]=finv[1]=1;
//    inv[1]=1;
    for(int i=2;i<=p;i++){
        fac[i]=fac[i-1]*i%p;
//        inv[i]=p-(inv[p%i]*(p/i)%p);
//        finv[i]=finv[i-1]*inv[i]%p;
    }
    printf("%lld\n",lucas(n+m,m));
}
int main()
{
//    freopen("data.in","r",stdin);
    int T;
    scanf("%d",&T);
    while(T--){
        solve();
    }
    return 0;
}

 

posted @ 2018-01-19 10:00  white_hat_hacker  阅读(130)  评论(0编辑  收藏  举报