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

14 篇文章 0 订阅
2 篇文章 0 订阅

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值