题目传送门
这次省选没参加,首先恭喜三位神犇进队(哇咔咔咔同校三个都进了),看了看两天的题,一眼看上去除了这道题都没什么思路(是不是早该退役了…),然后就把这道题写了写,其他题都在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\ )
cx≡cxmodφ(p)+φ(p)(modp ),而且对于
∀
x
,
p
∈
N
\forall x,p\in \mathbb {N}
∀x,p∈N都有此结论。证明在这里(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
[省选] [扩展欧拉函数] [线段树] [BZOJ4869] [HLOI2017] 相逢是问候
最新推荐文章于 2020-09-20 11:01:22 发布