zoukankan      html  css  js  c++  java
  • LG P2480 [SDOI2010]古代猪文

    Description

    猪王国的文明源远流长,博大精深。

    iPig 在大肥猪学校图书馆中查阅资料,得知远古时期猪文文字总个数为 $n$。当然,一种语言如果字数很多,字典也相应会很大。当时的猪王国国王考虑到如果修一本字典,规模有可能远远超过康熙字典,花费的猪力、物力将难以估量。故考虑再三没有进行这一项劳猪伤财之举。当然,猪王国的文字后来随着历史变迁逐渐进行了简化,去掉了一些不常用的字。

    iPig 打算研究古时某个朝代的猪文文字。根据相关文献记载,那个朝代流传的猪文文字恰好为远古时期的$frac 1k$,其中 $k$ 是 $n$ 的一个正约数(可以是 $1$ 或 $n$)。不过具体是哪 $frac 1k$,以及 $k$ 是多少,由于历史过于久远,已经无从考证了。

    iPig 觉得只要符合文献,每一种$k|n$ 都是有可能的。他打算考虑到所有可能的 $k$。显然当 $k$ 等于某个定值时,该朝的猪文文字个数为 $frac nk$。然而从 $n$ 个文字中保留下 $frac nk$ 个的情况也是相当多的。iPig 预计,如果所有可能的 $k$ 的所有情况数加起来为$p$ 的话,那么他研究古代文字的代价将会是 $g^p$

    现在他想知道猪王国研究古代文字的代价是多少。由于 iPig 觉得这个数字可能是天文数字,所以你只需要告诉他答案除以 $999911659$ 的余数就可以了。

    Solution

    题目要求$g^{sum{d|n C_n^d}} mod 999911659$

    分类讨论

    当底数与模数互质时可以用欧拉定理推得

    $$g^{sum{d|n C_n^d}} mod 999911659=g^{sum{d|n C_n^d mod 999911658}} mod 999911659$$

    模数大得飞起,不能直接Lucas,于是质因数分解模数

    $$999911659=2 imes 3 imes 4679 imes 35617$$

    所以可以计算$sum{d|n C_n^d}$模这四个数的值,用CRT求解方程组

    $$left{egin{matrix}
    x equiv a_1 & mod 2\
    x equiv a_2 & mod 3\
    x equiv a_3 & mod 4679\
    x equiv a_4 & mod 35617
    end{matrix} ight. $$

    解出$x$后快速幂求解

    当底数与模数不互质时特判

    #include<iostream>
    #include<cstdio>
    using namespace std;
    long long n,g,fac[]={0,2,3,4679,35617},a[10],jc[50005],inv[50005],ans;
    const long long mod=999911658;
    inline long long read()
    {
        long long f=1,w=0;
        char ch=0;
        while(ch<'0'||ch>'9')
        {
            if(ch=='-')
                f=-1;
            ch=getchar();
        }
        while(ch>='0'&&ch<='9')
        {
            w=(w<<1)+(w<<3)+ch-'0';
            ch=getchar();
        }
        return f*w;
    }
    long long ksm(long long a,long long p,long long m)
    {
        long long ret=1;
        while(p)
        {
            if(p&1)
            {
                (ret*=a)%=m;
            }
            (a*=a)%=m;
            p>>=1;
        }
        return ret;
    }
    void pre(long long p)
    {
        jc[0]=1;
        for(long long i=1;i<=p;i++)
        {
            jc[i]=jc[i-1]*i%p;
        }
    }
    long long C(long long x,long long y,long long p)
    {
        if(x<y)
        {
            return 0;
        }
        return jc[x]*ksm(jc[y],p-2,p)%p*ksm(jc[x-y],p-2,p)%p;
    }
    long long lucas(long long x,long long y,long long p)
    {
        if(!x)
        {
            return 1;
        }
        return lucas(x/p,y/p,p)*C(x%p,y%p,p)%p;
    }
    void CRT()
    {
        for(long long i=1;i<=4;i++)
        {
            (ans+=a[i]*(mod/fac[i])%mod*ksm(mod/fac[i],fac[i]-2,fac[i])%mod)%=mod;
        }
    }
    int main()
    {
        n=read();
        g=read();
        if(!(g%(mod+1)))
        {
            puts("0");
            return 0;
        }
        for(long long i=1;i<=4;i++)
        {
            pre(fac[i]);
            for(long long j=1;j*j<=n;j++)
            {
                if(!(n%j))
                {
                    (a[i]+=lucas(n,j,fac[i]))%=fac[i];
                    if(j*j!=n)
                    {
                        (a[i]+=lucas(n,n/j,fac[i]))%=fac[i];
                    }
                }
            }
        }
        CRT();
        printf("%lld
    ",ksm(g,ans,mod+1)%(mod+1));
        return 0;
    }
    [SDOI2010]古代猪文
  • 相关阅读:
    毕业设计进度5(2月5日)
    毕业设计进度4(2月4日)
    Intellij IDEA 安装Scala插件 + 创建Scala项目
    中国HBase技术社区第一届Meetup资料大合集
    【大会PPT+直播回顾】HBaseCon亚洲2018峰会
    Java 中的锁原理、锁优化、CAS、AQS 详解!
    Reactor 反应堆设计模式
    IO模型
    浅析Reactor设计模式
    将IDEA工程代码提交到Github
  • 原文地址:https://www.cnblogs.com/JDFZ-ZZ/p/13808317.html
Copyright © 2011-2022 走看看