luoguP3807 【模板】卢卡斯定理

卢卡斯定理模板题

当p为质数时,C(N,M)=C(N%P,M%P)*C(N/P,M/P);

我也不会证明- - 

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
ll p,a[maxn*2+10];
ll q_m(ll a,ll b){
    a%=p;ll ret=1;
    while(b>0){
        if(b&1){
            ret=(ret*a)%p;
        }
        a=(a*a)%p;
        b>>=1;
    }
    return ret;
}
ll c(int n,int m){
    if(m>n)return 0;
    return a[n]*q_m(a[n-m],p-2)*q_m(a[m],p-2)%p;
}
ll lucas(ll n,ll 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--){
        ll n,m;
        scanf("%lld%lld%lld",&n,&m,&p);
        a[0]=1;
        n+=m;
        for(int i=1;i<=n;++i){
            a[i]=(a[i-1]*i)%p;
        }
        
        printf("%lld\n",lucas(n,m)%p);
    }
    return 0;
    
}

猜你喜欢

转载自www.cnblogs.com/Dream-Runner/p/9451573.html