洛谷 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

posted @ 2025-11-14 11:57  xiehanrui0817  阅读(7)  评论(0)    收藏  举报