卢卡斯定理模板

#define ll long long

ll Exgcd(ll a,ll b,ll& x,ll& y){
    if(a%b==0){
        x=0,y=1;
        return b;
    }
    ll r,tx,ty;
    r=Exgcd(b,a%b,tx,ty);
    x=ty;
    y=tx-a/b*ty;
}

ll Comp(ll a,ll b,ll m){
    if(a<b) return 0;
    if(a==b) return 1;
    if(b>a-b) b=a-b;
    ll ans=1,ca=1,cb=1;
    for(int i=0;i<b;i++){
        ca=ca*(a-i)%m;
        cb=cb*(b-i)%m;
    }
    ll x,y;
    Exgcd(cb,m,x,y);
    x=(x%m+m)%m;
    ans=ca*x%m;
    return ans;
}
//a^b mod m
ll Lucas(ll a,ll b,ll m){
    ll ans=1;
    while(a&&b){
        ans=(ans*Comp(a%m,b%m,m))%m;
        a/=m;
        b/=m;
    }
    return ans;
}

 

posted on 2018-12-15 15:53  欣崽  阅读(174)  评论(0编辑  收藏  举报

导航