Loading

光速幂技巧

有一个问题,即求:

\[a^b\bmod p \]

底数 \(a\) 和模数 \(p\) 均固定。

朴素做法是快速幂,时间复杂度 \(O(\log p)\)

\(b\) 的值域为 \(0\sim v\),则存在一种 \(O(\sqrt v)\) 预处理,\(O(1)\) 查询的算法,我们一般称其为光速幂

如何做,考虑阈值分治,设置阈值 \(\omega\)

预处理出 \(a^0,a^1,a^2,...,a^{\omega-1}\) 以及 \(a^0,a^{\omega},a^{2\omega},...,a^{\lceil\frac{v}{\omega}\rceil\omega}\)

回答询问 \(a^b\bmod p\) 时直接输出 \(a^{b\bmod\omega}\times a^{\lfloor\frac{b}{\omega}\rfloor\omega}\) 皆可,很显然复杂度 \(O(1)\)

预处理复杂度 \(O(\omega+\frac{v}{\omega})\),显然 \(\omega\)\(\sqrt v\) 时最优,此时预处理复杂度为 \(O(\sqrt v)\)

从而我们做到了 \(O(\sqrt v)\) 预处理,\(O(1)\) 查询。

不过由于其要求底数和模数固定,所以比较局限。

posted @ 2022-06-03 19:02  lstqwq  阅读(345)  评论(0编辑  收藏  举报