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$后快速幂求解
当底数与模数不互质时特判
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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; }