【六省联考2017】相逢是问候

  • 我还停留在 oyyp 去年 8 月的水平,我真的没救了,以后准备铁牌退役吧

Description

  https://loj.ac/problem/2142

Solution

  考察对扩展欧拉定理的理解。
  我们知道扩展欧拉定理长这样 $$a^b% p = a^{b% \varphi(p) + (b\ge \varphi(p) ? \varphi(p) : 0)}$$
  那么进行一次题目中的修改操作,得到 \(a^{a^b}\),发现 $$\begin{align} a{ab}% p &= a{ab% \varphi(p)+(a^b\ge \varphi(p) ? \varphi(p) : 0)}% p \nonumber \ &= a{a% \varphi(p) + \cdots}% p \nonumber \end{align}$$(“\(\cdots\)” 用于省略类似于 \((b\ge \varphi(p) ? \varphi(p) : 0)\) 的语句)
  不难发现指数每往上一级,模数 \(p'\) 就会求一次欧拉函数,即 \(\varphi(p')\)
  有个性质:对于一个正整数 \(p\),不断地对其求欧拉函数,至多求 \(2\log p\) 次就会变成 \(1\),之后一直都是 \(1\)。证明很简单自己去看
  故当一个数 \(a\) 被进行一定次题目中的修改操作后,再怎么修改值都不会变了,故我们可以忽略掉以后对它的操作。
  用线段树维护题目给定的数组,区间修改下传 tag 时,若这个区间中所有数的修改次数都够了,就不用下传 tag 了。tag 下传到叶子节点时,暴力重算该点的值即可(这里需要快速幂,故复杂度再多一个 \(\log\)),每个数最多被暴力重算 \(2\log p\) 次,故复杂度是对的。
  时间复杂度 \(O(n\log n\log^2 p)\)

  这个复杂度有可能跑不过。不难发现由于快速幂的底数始终是个定值 \(c\),所以可以 \(O(\sqrt{p})\) 预处理、\(O(1)\) 查询,即光速幂。具体做法:预处理出 \(c^{0\cdots 10000}\),再预处理出 \(d^{0\cdots 10000}\)\(d=c^{10000}\)),查询 \(c^k\) 时求 \(d^{k/10000}\times c^{k\%10000}\),注意单独处理 \(k=10^8\) 的情况。
  时间复杂度 \(O(n\log n\log p)\)

posted @ 2019-10-16 15:17  大本营  阅读(163)  评论(0编辑  收藏  举报