洛谷 P3747
给定长度为 \(n\) 的数组 \(a\), 以及 \(m\) 次操作还有 \(c, p\),每次操作给定操作类型以及 \(l, r\),两种操作分别是:
- 对于 \(l \le i \le r\),\(a_i \leftarrow c^{a_i}\)。
- 输出 \((a_l + a_{l + 1} + \dots + a_r) \mod p\)。
\(n, m \le 5 \times 10^5, 1 \le a_i, c < p \le 10^8\)
根据欧拉定理,求 \(c^{a_i} \mod p\) 就是要求 \(a_i \mod \varphi(p)\) 的结果(是否 \(+ \varphi(p)\) 判一下) 。\(c^{c^{a_i}} \mod p\) 就是求 \(a_i \mod \varphi(\varphi(p))\)……
因为 \(\varphi(p)\) 叠最多 \(\log p\) 次就变成 \(1\),所以对于一个 \(i\) 操作 \(k\) 次就不变了(\(k\) 为 \(p\) 通过不断取 \(\varphi\) 变成 \(1\) 的次数),搞个势能线段树即可。
还有个问题,令 \(b_{i, j}\) 表示 \(c^{{c^{\cdots}}^{a_i}}\)(叠 \(j\) 层)的答案,每个 \(b_{i, j}\) 要往上算 \(m\) 次,每次还要快速幂,就三个 \(\log\) 了会炸掉。解决方式是优化快速幂,类似 BSGS,预处理出 \(c^1, c^2 \dots , c^{B}, c^{2B}, c^{3B}, \dots \mod p_i\) 的结果(\(p_i\) 是 \(p\) 取 \(i\) 次 \(\varphi\) 的结果),算快速幂时可以改成两个东西相乘的结果。
时间复杂度:\(O((n + m) \log^2p)\)。
细节数论题。
坑点
- 因为幂次可能会 \(+ \varphi\),所以 \(B\) 要开到 \(\sqrt {2p}\)。
- 取 \(\varphi\) 到最后 \(p = 1\) 时,通过 \(a_i\) 是否为 \(0\) 判断返回 \(0 / 1(是否 + \varphi(1))\),但如果 \(a_i = 0\) 且上面还会继续叠,实际上要返回 \(1\)(\(c^0 = 1\)), 解决方法是在 \(k\) 个模数最后再添加一个 \(1\) 处理一下。
1 4 3 2
0
0 1 1
0 1 1
0 1 1
1 1 1
浙公网安备 33010602011771号