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 \times 3 \times 4679 \times 35617$$

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

$$\left\{\begin{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}\right. $$

解出$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\n",ksm(g,ans,mod+1)%(mod+1));
    return 0;
}
[SDOI2010]古代猪文

 

posted @ 2020-10-13 13:45  QDK_Storm  阅读(181)  评论(0编辑  收藏  举报