去年六省联考唯一的一道黑牌题,我今天一天从早到晚,把它从暴力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 }