去年六省联考唯一的一道黑牌题,我今天一天从早到晚,把它从暴力15分怼到了90分,极端接近正解了。

bzoj上A了,但是洛谷和loj上面就不行。伪正解会T,奇奇怪怪的类正解会WA。。

那么,网上的题解多得很,我就不细说了。

着重说一下我的理解感受和坑点。

1.不愧是黑牌题,显得十分的繁杂(并不)。

首先要用到扩展欧拉定理,φ(),还有线段树辅助,快速幂,大量奇奇怪怪的小细节.....要人命啊。

2.根据之前那题上帝集合,我们可以得知当一个数被操作很多很多很多很多次之后就不变了,成为一个常数。

3.我们首先算出这个次数:phi()到1就是了。特别的,phi(2)=1之后还要再写个phi(1)=1,否则会错。证明网上也很多,我比较推崇这个。(该证明并没有被再次找到......)

4.第一个坑点来了:(c^c^i)%p ≠ (c^((c^i)%p))%p 什么意思呢?意思就是你改一次之后不能接着改第二次,会WA。打暴力时就是这一点卡停了我的思路。如何解决:真·暴力!从初始值a[i]开始重新改起。我:......

5.解决了上面那一件事之后,我们开始着手研究扩展欧拉公式降次的那个式子。把(c^c^i)%p化开之后再一步步推下去,最后我们可以得到这么一个可爱的函数:

 

 1 LL cal(int k,int t)
 2 {
 3     while(t>0)
 4     {
 5         if(k>=p[t]) k=qpow(c,k%p[t]+p[t],p[t-1]);
 6         else k=qpow(c,k,p[t-1]);
 7         t--;
 8     }
 9     return k;
10 }
初等cal函数

相关文章: