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

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

Description

  https://loj.ac/problem/2142

Solution

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

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

原文地址:https://www.cnblogs.com/scx2015noip-as-php/p/loj2142.html