2020.2.17更新,将模板改为c++版,以及增加了对循环版快速幂的理解
一、问题引入
求 a n m o d p a^n \ mod \ p an mod p 的结果
分析
- 思路:看到这样的题目,我们最容易想到就是直接写一个n次的循环,每次循环乘上一个a,最后再对结果mod p就能得到结果。
- 改错:为了防止数据溢出,我们利用取模的性质 ( a ∗ b ) m o d p = ( ( a m o d p ) ∗ ( b m o d p ) ) m o d p (a * b) \ mod \ p=((a \ mod \ p)*(b \ mod \ p)) \ mod \ p (a∗b) mod p=((a mod p)∗(b mod p)) mod p,循环中每次乘a都mod p一次。
- 缺陷:这种暴力法的时间复杂度是 O ( b ) O(b) O(b),如果b的值比较大的话,就很难在题目规定的时间内计算出结果。
二、快速幂
其实可以利用分治思想对暴力法进行优化,我们可以这样想:
a n = { a n / 2 ∗ a n / 2 , if n is even a n / 2 ∗ a n / 2 ∗ a , if n is odd a^n = \begin{cases} a^{n/2}*a^{n/2}, & \text {if $n$ is even} \\ a^{n/2}*a^{n/2}*a, & \text{if $n$ is odd} \end{cases} an={
an/2∗an/2,an/2∗an/2∗a,if n is even