光速幂技巧
有一个问题,即求:
\[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)\) 查询。
不过由于其要求底数和模数固定,所以比较局限。