古代猪文

Posted 2462478392lee

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了古代猪文相关的知识,希望对你有一定的参考价值。

题目链接

题意:求G^M mod P,M=∑ i|N C(N,i),P=999911659。

思路:G^M  mod P = G^(M mod (P-1) ) ( G != P),所以只要得出 M mod (P-1) 即可用快速幂求出答案

N的约数可以在√n的时间内求出,所以问题转化为求C(N,i) mod (P-1),发现p-1不是一个质数,P-1=2*3*4679*35617

只要求出C(N,i) mod 每个因数的值,得到4个取模方程,最后用中国剩余定理合并模线性方程组,求解。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<map>
#include<queue>
#include<vector>
#include<string>
#include<set>
#define ll long long
using namespace std;
const ll N=40005,P=999911659,M=P-1;
ll n,G,a[8],m[8],fac[N],inv[N],fac_inv[N],res;
ll power(ll a,ll b,ll mod)

    ll c=1;
    for(;b;b>>=1)
    
        if(b&1)
        c=(ll)c*a%mod;
        a=(ll)a*a%mod;
    
    return c%mod;

ll C(ll n,ll m,ll MOD)
    if(n<MOD&&m<MOD) 
    return n<m?0:fac[n]*fac_inv[m]%MOD*fac_inv[n-m]%MOD;
    return C(n%MOD,m%MOD,MOD)*C(n/MOD,m/MOD,MOD)%MOD;

int main()

    scanf("%lld%lld",&n,&G);
    G%=P;
    if(G==0)
    printf("0\n");
    else
    
        m[1]=2;
        m[2]=3;
        m[3]=4679;
        m[4]=35617;
        for(int k=1;k<=4;k++)
        
            fac[0]=1;
            int u=m[k]+5;
            for(int i=1;i<=u;i++)
            fac[i]=fac[i-1]*i%m[k];
            inv[1]=1; 
            for(int i=2;i<=u;i++) 
            inv[i]=(ll)(m[k]-m[k]/i)*inv[m[k]%i]%m[k];
            fac_inv[0]=1; 
            for(int i=1;i<=u;i++) 
            fac_inv[i]=fac_inv[i-1]*inv[i]%m[k];
        //    printf("fac_inv:%lld\n",fac[3]);
            for(ll i=1;i*i<=n;i++)
            
                if(n%i==0)
                
                    (a[k]+=C(n,i,m[k]))%=m[k];
                    if(i*i!=n) (a[k]+=C(n,n/i,m[k]))%=m[k];
                
            
        //    printf("a[k]:%lld\n",a[k]);
            (res+=a[k]*(M/m[k])%M*power(M/m[k],m[k]-2,m[k])%M)%=M;
        
    //    printf("res:%lld\n",res);
        printf("%lld\n",power(G,res,P));
        

 

以上是关于古代猪文的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ 1951 Sdoi2010 古代猪文

BZOJ1951-[Sdoi2010]古代猪文

bzoj 1951: [Sdoi2010]古代猪文

古代猪文 BZOJ 1951

SDOI 2010 古代猪文

bzoj1951 [Sdoi2010]古代猪文