$($仅供观赏$)$测试
猪王国的文明源远流长,博大精深。ui
$iPig$在大肥猪学校图书馆中查阅资料,得知远古时期猪文文字总个数为$N$。固然,一种语言若是字数不少,字典也相应会很大。当时的猪王国国王考虑到若是修一本字典,规模有可能远远超过康熙字典,花费的猪力、物力将难以估量。故考虑再三没有进行这一项劳猪伤财之举。固然,猪王国的文字后来随着历史变迁逐渐进行了简化,去掉了一些不经常使用的字。spa
$iPig$打算研究古时某个朝代的猪文文字。根据相关文献记载,那个朝代流传的猪文文字刚好为远古时期的$k$分之一,其中$k$是$N$的一个正约数(能够是$1$和$N$)。不过具体是哪$k$分之一,以及$k$是多少,因为历史过于久远,已经无从考证了。code
$iPig$以为只要符合文献,每一种能整除$N$的$k$都是有可能的。他打算考虑到全部可能的k。显然当$k$等于某个定值时,该朝的猪文文字个数为$N / k$。然而从$N$个文字中保留下$N / k$个的状况也是至关多的。$iPig$预计,若是全部可能的k的全部状况数加起来为$P$的话,那么他研究古代文字的代价将会是$G$的$P$次方。get
如今他想知道猪王国研究古代文字的代价是多少。因为$iPig$以为这个数字多是天文数字,因此你只须要告诉他答案除以$999911659$的余数就能够了。it
给定 $n$ 和 $G$ $,$ 求 $:$ $G^{\sum_{d|n}C_n^d}\bmod 999911659$io
【数据规模】ast
$10%$ $1 \leqslant N \leqslant 50$class
$20%$ $1 \leqslant N \leqslant 1000$gc
$40%$ $1 \leqslant N \leqslant 100000$
$100%$ $1 \leqslant N \leqslant 1000000000,1 \leqslant G \leqslant 1000000000$
看到上面这个式子,很容易想到暴力解法:枚举 $n$ 的全部正约数 $d$,分别求出 $C_n^d$ 并累加答案,最后对 $999911659$ 取模,若是你的目的不是 $pian$ $fen$ 而是 $AC$,而且甘愿屈服于 $TLE$,$MLE$,$RE$ 的统治,那么就大胆的去尝试吧!
(什么?你说你不知道欧拉定理?(O__O "…))
公式:$a^b \equiv a^{b\bmod \varphi(P)}(\bmod P)$ $,$ $gcd(a,P)=1$
在本题中 $P=999911659$ 是一个质数(不要问我是怎么知道的),因此对任意 $a$ 均知足 $gcd(a,P)=1$,且有 $\varphi(P)=P-1$。
根据公式可得 $G^{\sum_{d|n} C_n^d}=G^{\sum_{d|n}C_n^d\bmod 999911658}(\bmod 999911659)$
所以本题关键是计算 $\sum_{d|n}C_n^d\bmod 999911658$
*公式: $C_n^m=C_{n\bmod P}^{m\bmod P}C_{n/P}^{m/P}(\bmod P)$
求组合数并要求取模,一看就知道要用 $Lucas$ 定理,这里很少说。
可是...... 模数不为质数而且数据规模简直无敌,仍然会被 $TLE,MLE,RE$摁在地上摩擦。 因而咱们须要将这个大巨无霸问题分解成小蒟蒻问题。
对 $999911658$ 分解质因数,获得 $999911658=234679*35617$ ,它的全部质因子的指数都为 $1$ ,这一类数被称做 $Square$ $Free$ $Number$ 。 $Q:$ 这样作有什么用呢? $A:$ 立刻就会提到。。。
首先用 $Lucas$ 定理分别求出 $\sum_{d|n}C_n^d$ 对 $2,3,4679,35617$ 这四个质数取模后的值,记为 $a_1,a_2,a_3,a_4$ ,而后用中国剩余定理解一个线性同余方程组:
$\begin{cases}x\bmod 2=a_1\x\bmod 3=a_2\x\bmod 4679=a_3\x\bmod 35617=a_4\end{cases}$
因而咱们就获得了 $\sum_{d|n}C_n^d\bmod 999911658$ 的一个最小非负整数解 $x$,最后再用一次快速幂计算 $G^x$就是答案。
#pragma GCC optimize(3,"Ofast","inline") #pragma GCC optimize(2) #include<cstdio> #define LL long long #define Re register LL const int PP=35617,P=999911658; LL x,y,i,j,n,G,fu,ans,a[5],jc[PP+3]={1},mod[5]={0,2,3,4679,35617};char c; inline void in(Re &x){//【快读】本身动手,丰衣足食 fu=x=0;c=getchar(); while(c<'0'||c>'9')fu|=c=='-',c=getchar(); while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar(); x=fu?-x:x; } inline LL mi(Re x,Re k,Re P){//【快速幂】若是你非要写龟速乘我也拦不住你 Re s=1; while(k){ if(k&1)(s*=x)%=P; (x*=x)%=P,k>>=1; } return s; } inline LL Lucas(Re m,Re n,Re p){//【Lucas定理】 if(n<m)return 0; if(n<p)return jc[n]*mi(jc[m],p-2,p)%p*mi(jc[n-m],p-2,p)%p; return Lucas(m/p,n/p,p)*Lucas(m%p,n%p,p)%p; } inline void init(Re P){for(Re i=1;i<=P;++i)jc[i]=jc[i-1]*i%P;}//【预处理阶乘】 //对于四个模数都要预处理出不一样的阶乘 inline void exgcd(Re &x,Re &y,Re a,Re b){//【扩欧】解线性同余方程 if(!b){x=1,y=0;return;} exgcd(x,y,b,a%b);Re X=x; x=y,y=X-a/b*y; } int main(){ in(n),in(G); if(G%(P+1)==0){printf("0");return 0;}//若是定义P=999911658,注意这里要加 1 //当 G 为 999911659 的倍数时,直接特判结束 for(i=1;i<=4;++i){//【分解质因数】 init(mod[i]);//【初始化阶乘】 for(j=1;j*j<n;++j) if(n%j==0)(((a[i]+=Lucas(j,n,mod[i]))%=mod[i])+=Lucas(n/j,n,mod[i]))%=mod[i]; //累加组合数并取模 if(j*j==n)(a[i]+=Lucas(j,n,mod[i]))%=mod[i]; } for(i=1;i<=4;++i){//【中国剩余定理】跑一遍 CRT 解方程组 Re M=P/mod[i];exgcd(x,y,M,mod[i]); (x+=mod[i])%=mod[i];(ans+=M*x%P*a[i]%P)%=P; } printf("%lld",mi(G,(ans+P)%P,P+1));//加 1..... }
善良无比的 わたし 提供了本题的测试数据(98u9)哦$QAQ$