[NOIP 2011]計算係數 乘法逆元+擴展歐幾里得

代碼

#include <cstdio>
#include <iostream>
#include <cstring>
#define MOD 10007
using namespace std;
typedef long long ll;


ll Quick_Pow(ll a,ll b){
    ll re=1;
    while(b){
        if(b&1){
            re*=a;
            re%=MOD;
        }
        a*=a;
        a%=MOD;
        b>>=1;
    }
    return re;
}

void ExGcd(ll a,ll b,ll& x, ll& y) {
    if(b==0){
        x=1;y=0;
        return;
    }
    ExGcd(b,a%b,x,y);
    ll t=x;x=y;y=t-a/b*y;
}

ll Mod_Inverse(ll a,ll b){
    ll x,y;
    ExGcd(a,b,x,y);
    x%=b;
    while(x<=0) x+=b;
    return x;
}

ll Fac(ll x){
    ll re=x;
    while(--x){
        re*=x;
        re%=MOD;
    }
    return re;
}

ll Combine(ll k,ll m) {
    ll a=1,b=1,c=1,r=1,ine=1;
    a=Fac(k);b=Fac(m);c=Fac(k-m);   
    r=((b%MOD)*(c%MOD))%MOD;    
    ine=Mod_Inverse(r,MOD);
    return a*ine%MOD;   
}

ll a,b,k,n,m;

ll Calculate(){
    return Combine(k,m)%MOD*Quick_Pow(a,n)%MOD*Quick_Pow(b,m)%MOD;
}

int main(){
    cin>>a>>b>>k>>n>>m;
    cout<<Calculate()<<endl;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章