光速幂
神犇们YY出来的算法
问题:
求\(p^q \bmod n\),其中\(p\)是定值,\(q\)的上限给定,\(n\le 10^9+7\),是定值。即必须底数固定,模数固定。
询问次数大于\(10^7\)
很明显,这题卡了快速幂,所以我们考虑利用上\(p\)是定值这一条件。考虑拆解\(q\),容易发现:\(q=\sqrt{q}\left\lfloor\frac{q}{\sqrt{q}}\right\rfloor+q\bmod \sqrt{q}\)。
证明这个式子的话,由于\(q\bmod \sqrt q=q-\sqrt{q}\left\lfloor\frac{q}{\sqrt{q}}\right\rfloor\),带入即可
那么就有先用扩欧将\(q\)固定到一定范围,然后由于我们上面的式子为
\[p^q=p^{\sqrt{q}·{\frac{q}{\left\lfloor\sqrt q\right\rfloor}}}p^{p\bmod \sqrt{q}} \]考虑预处理出\(p\)的\(1\sim\sqrt{n}\)次方,\(p^{\sqrt{n}}\)的\(1\sim \frac{n}{\sqrt{n}}\)次方,那么对于一个询问\(q\),将\(q\)分解为\(k\sqrt{n}+t\)的方式即可解决
标签:lfloor,right,frac,光速,bmod,sqrt,rfloor From: https://www.cnblogs.com/oierpyt/p/16950417.html