zoukankan      html  css  js  c++  java
  • codeforces2015ICL,Finals,Div.1#J Ceizenpok’s formula【扩展lucas】

    传送门

    [题意]:

    求C(n,k)%m,n<=108,k<=n,m<=106

    [思路]:

    扩展lucas定理+中国剩余定理

       

    #include<cstdio>
    using namespace std;
    typedef long long ll;
    ll n,m,MOD,ans;
    ll fpow(ll a,ll p,ll mod){
        ll res=1;
        for(;p;p>>=1,a=a*a%mod) if(p&1) res=res*a%mod;
        return res;
    }
    void exgcd(ll a,ll b,ll &d,ll &x,ll &y){
        if(!b){d=a;x=1;y=0;return ;}
        exgcd(b,a%b,d,y,x);
        y-=a/b*x;
    }
    ll inv(ll a,ll p){
        ll d,x,y;
        exgcd(a,p,d,x,y);
        return d==1?(x%p+p)%p:-1;
    }
    ll mul(ll n,ll pi,ll pk){
        if(!n) return 1;
        ll ans=1;
        if(n/pk){
            for(ll i=2;i<=pk;i++) if(i%pi) ans=ans*i%pk;
            ans=fpow(ans,n/pk,pk);
        }
        for(ll i=2;i<=n%pk;i++) if(i%pi) ans=ans*i%pk;
        return ans*mul(n/pi,pi,pk)%pk;
    }
    ll C(ll n,ll m,ll pi,ll pk,ll mod){
        if(n<m) return 0;
        ll a=mul(n,pi,pk),b=mul(m,pi,pk),c=mul(n-m,pi,pk);
        ll ans,k(0);
        for(ll i=n;i;i/=pi) k+=i/pi;
        for(ll i=m;i;i/=pi) k-=i/pi;
        for(ll i=n-m;i;i/=pi) k-=i/pi;
        ans=a*inv(b,pk)%pk*inv(c,pk)%pk*fpow(pi,k,pk)%pk;
        return ans*(mod/pk)%mod*inv(mod/pk,pk)%mod;
    }
    int main(){
        scanf("%I64d%I64d%I64d",&n,&m,&MOD);
        ll x=MOD;
        for(ll pk,i=2;i*i<=MOD;i++){
            if(!(x%i)){
                pk=1;
                while(!(x%i)) pk*=i,x/=i;
                ans=(ans+C(n,m,i,pk,MOD))%MOD;
            }
        }
        if(x>1) ans=(ans+C(n,m,x,x,MOD))%MOD;
        printf("%I64d
    ",ans);
        return 0;
    }
  • 相关阅读:
    vue主动刷新页面及列表数据删除后的刷新实例
    一些VUE技巧收藏
    d2-admin中不错的技巧
    webSocket另一种封装
    基于token前后端分离认证
    node.js使用vue-native-websocket实现websocket通信 实测有效
    Vue 路由传递参数
    ES6中import {} 的括号
    Vue 参数传递
    简单工厂模式
  • 原文地址:https://www.cnblogs.com/shenben/p/6600629.html
Copyright © 2011-2022 走看看