zoukankan      html  css  js  c++  java
  • 古代猪文

    数论模板混合好题

    #include<bits/stdc++.h>
    #define re return
    #define ll long long
    #define inc(i,l,r) for(int i=l;i<=r;++i)
    using namespace std;
    template<typename T>inline void rd(T&x)
    {
        char c;bool f=0;
        while((c=getchar())<'0'||c>'9')if(c=='-')f=1;
        x=c^48;
        while((c=getchar())>='0'&&c<='9')x=x*10+(c^48);
        if(f)x=-x;
    }
    
    const int maxn=36000;
    ll jc[maxn],inv[maxn],jcinv[maxn],N,G;
    
    ll C(int n,int m,int mod)//组合数 
    {
        if(m>n)re 0;
        re jc[n]*jcinv[n-m]%mod*jcinv[m]%mod;
    }
    
    ll LUCAS(int n,int m,int mod)//卢卡斯定理 
    {
        if(!m)re 1;
        re C(n%mod,m%mod,mod)*LUCAS(n/mod,m/mod,mod)%mod;
    }
    
    inline void Get_math(int mod)
    {
        //得到当前模数下的阶乘,阶乘逆元 
        jcinv[0]=jcinv[1]=inv[1]=jc[1]=jc[0]=1;
        inc(i,2,mod)
        {
            inv[i]=(mod-mod/i)*inv[mod%i]%mod;
            jcinv[i]=jcinv[i-1]*inv[i]%mod;
            jc[i]=jc[i-1]*i%mod;
        }
    }
    
    inline ll Get_crt(int mod)
    {
        
        ll sum=0;
        Get_math(mod);
        inc(i,1,sqrt(N))
        if(N%i==0)//寻找整除N的K 
        {
            sum=(sum+LUCAS(N,i,mod))%mod;
            if(i*i!=N)//防止重复 
            sum=(sum+LUCAS(N,N/i,mod))%mod;
        }
        re sum;
    }
    
    
    inline ll pow(ll a,ll x,ll mod)
    {
        if(!a)re 0;
        ll ret=1;
        while(x)
        {
            if(x&1)ret=ret*a%mod;
            a=a*a%mod;
            x>>=1;
        }
        re ret;
    }
    
    
    int main()
    {
        freopen("in.txt","r",stdin);
        ll a1,a2,a3,a4,x,M=999911658;
        ll inv1,inv2,inv3,inv4;
        rd(N),rd(G);    
        
        //得到中国剩余定理的X=(请当做同余)A(mod p)中的A 
        a1=Get_crt(2); 
        a2=Get_crt(3);
        a3=Get_crt(4679);
        a4=Get_crt(35617);
        //剩余定理求解 
        inv1=pow(M/2,2-1,M)*a1;
        //Mi*(Mi^(p-2))*ai前面可以合并
        //并对M取模得到最小正整数解 
        inv2=pow(M/3,3-1,M)*a2;
        inv3=pow(M/4679,4679-1,M)*a3;
        inv4=pow(M/35617,35617-1,M)*a4;
        
         printf("%lld",pow(G%(M+1),(inv1+inv2+inv3+inv4)%M,M+1));
        re 0;
    }
  • 相关阅读:
    异构数据库同步工具调研
    ubuntu16.04 Golang语言开发环境搭建
    串口USB单一映射及重命名
    linux arm 交叉编译ACE(ubuntu16.04)
    ubuntu16.04 下Mongo数据库搭建
    ubuntu 增加一个用户 并赋予权限
    go 通过http发送图片file内容
    git 简单命令总结
    gitlab ssh_key
    ubuntu16.04 程序开机自启动设置及启动优化
  • 原文地址:https://www.cnblogs.com/lsyyy/p/11569495.html
Copyright © 2011-2022 走看看