光速幂

光速幂

神犇们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\)的方式即可解决

posted @ 2022-12-04 18:50  spdarkle  阅读(25)  评论(0)    收藏  举报