组合数C( ) 取模

发布时间 2023-04-21 17:04:32作者: towboat

 

#define ll long long
ll inv[22];
ll pow(ll a,ll b,ll p){
    ll ans=1;
    while(b){
        if (b%2) ans=(ans*a)%p;
        b/=2;
        a=(a*a)%p;
    }
    return ans;
}

void get_inv(ll n,ll p){
    inv[1]=1;
    for (ll i=2;i<=n;i++){
        inv[i]=inv[p%i]*(p-p/i)%p;
    }
}

int C(ll y,ll x){
    if (y<0||x<0||y<x) return 0;
    y%=mod;
    if (y==0 || x==0) return 1;
    ll ans=1;
    for (int i=0;i<x;i++){
        ans=1ll*ans*(y-i)%mod;
    }
    for (int i=1;i<=x;i++){
        ans=1ll*ans*inv[i]%mod;
    }
    return ans;
}
 
 signed main(){
 	get_inv(15,mod);
 	cout <<C(5,3) ;
    return 0;
}