• 欢迎光临~

扩展卢卡斯

开发技术 开发技术 2022-11-21 次浏览
inline int CRT(int x,int p,int mod){
    return x*(p/mod)%p*inv(p/mod,mod)%p;
}
inline int fac(int n,int pi,int pk){
    if(!n)return 1;
    int ans=1;
    for(int i=2;i<=pk;i++)if(i%pi)(ans*=i)%=pk;
    ans=po(ans,n/pk,pk);
    for(int i=2;i<=n%pk;i++)if(i%pi)(ans*=i)%=pk;
    return ans*fac(n/pi,pi,pk)%pk;
}
inline int C(int n,int m,int pi,int pk){
    int up=fac(n,pi,pk),d1=fac(m,pi,pk),d2=fac(n-m,pi,pk),k=0;
    for(int i=n;i;i/=pi)k+=i/pi;
    for(int i=m;i;i/=pi)k-=i/pi;
    for(int i=n-m;i;i/=pi)k-=i/pi;
    return up*inv(d1,pk)%pk*inv(d2,pk)%pk*po(pi,k,pk)%pk;
}
inline int exLucas(int n,int m,int p){
    int ans=0,tmp=p,pk;
    for(int i=2;i*i<=p;i++){
        if(tmp%i)continue;
        pk=1;
        while(tmp%i==0)pk*=i,tmp/=i;
        (ans+=CRT(C(n,m,i,pk),p,pk))%=p;
    }
    if(tmp>1)(ans+=CRT(C(n,m,tmp,tmp),p,tmp))%=p;
    return ans;
}
}
程序员灯塔
转载请注明原文链接:扩展卢卡斯
喜欢 (0)
违法和不良信息举报电话:022-22558618 举报邮箱:dljd@tidljd.com