[省选] [扩展欧拉函数] [线段树] [BZOJ4869] [HLOI2017] 相逢是问候

来源:互联网 发布:淘宝买家不确认收货 编辑:程序博客网 时间:2024/05/17 07:47

题目传送门
这次省选没参加,首先恭喜三位神犇进队(哇咔咔咔同校三个都进了),看了看两天的题,一眼看上去除了这道题都没什么思路(是不是早该退役了……),然后就把这道题写了写,其他题都在BZOJ上,网上题解多的是抄一份就行啦
HLOI头一次放在BZOJ上好激动!(虽然六省统考……)
CCF搞什么……题目德语666
两个操作,第一个是对函数f(x)=cx进行迭代操作,第二个是求区间和。
我觉得学过OI的人就会想到线段树(雾
线段树,维护什么?
诶这个结构在哪里见过?传送门
Po姐也是THU的我严重怀疑内部有点交(内啥)易
woc这不就是BZOJ3884的简化吗?
一般性证明详见Po姐的3884,下面是适用于本题的结论的一些证明:
引理1:(Solution中写的是扩展欧拉函数?)
xφ(p)时,cxcxmodφ(p)+φ(p)(modp ),而且对于x,pN都有此结论。证明在这里(ZQC%%%)。
然后就和3884差不多了,先对欧拉函数进行迭代,从φ(p)开始,迭代到φ(x)=1为止,最后再加一个1。迭代到最后还要再迭代一次……因为φ(1)=1,继续迭代一次后会将这种情况再计算一遍,要不然就会出现一些奇奇怪怪的错误(比如原数据第9组和第11组出现的计算问题……现在修正了……听说Picks被d得挺惨?)。这里时间是O(log2p)的。
然后修改就可以根据引理1暴力计算,其中有个快速幂可以预处理中分块处理。计算出c214modp[i],然后就可以以214为分界处理出两边的值,经过O(1)的计算就可以得到[0,228]之间cjmodp[i]的值,这里时间是O(214log2P)的。并且228=268435456可以包含数据范围。
对于每一次区间迭代,记录一点的迭代次数,若这一点迭代次数已超过log2p则不再进行迭代,因为此时迭代后结果与之前都相同了,如果不超过这一值,则根据引理1进行计算,对于一个点,由于之前的预处理,计算代价是log2p的。但是整个迭代是O(T1nlog2p)的;
对于查询区间和,记录区间和,直接查询即可,时间为O(T2log2n)
这里把整条线段上每个点都检查了一遍,如果这样的话总复杂度爆炸,如同UOJ228一样,如果发现这一段区间都不需要继续迭代了,就可以打上标记直接退出,据题解说这是均摊O(Tlog2n)的。
所以,总时间复杂度为O(log2p+214log2p+Tlog2nlog2p)的,BZOJ上跑的还挺快……
UPD:现在代码已经修正了。感谢x同学的提醒。
Code

0 0