快速幂:
快速幂(Exponentiation by squaring)是一种可以高效计算幂运算的方法。在计算a的n次方时,传统的方法是使用循环连续乘a n次。而快速幂的思想是通过将指数进行二进制拆分,以及利用幂运算的特性,大大减少了计算的次数,从而提高了计算效率。
具体步骤如下:
- 将指数n转化为二进制,以便拆分。
- 初始化一个累积值result为1。
- 从最低位开始,遍历二进制数的每一位。
- 如果当前位为1,将累积值result乘以底数a。
- 将底数a自乘,即a自乘一次。
- 将底数a自乘,即a自乘一次。
- 取下一位二进制数。
- 重复步骤3-5,直到遍历完整个二进制数。
- 最后,累积值result即为底数a的n次方。
通过这种方法,可以将指数n的二进制表示形式中的每一位都利用起来,而不是逐位相乘。这样可以大大减少计算的次数。对于一个n位的二进制数,只需要进行O(log(n))次计算即可得到结果,相比传统的方法,复杂度大大降低。
快速幂模板:
long long fastPow(long long a, long long b, long long mod) {
long long res = 1;
while (b > 0) {
if (b & 1) {
res = (res * a) % mod;
}
a = (a * a) % mod;
b >>= 1;
}
return res;
}
这个函数接受三个参数:底数 a
、指数 b
和取模数 mod
。它计算并返回 a
的 b
次方对 mod
取余的结果。
该算法通过将指数 b
转换为二进制形式,每次迭代都计算当前位上的幂值,如果该位为 1,则将结果乘以当前位的幂值,最后返回结果。迭代的过程中,每次将底数 a
自乘并对 mod
取余,以避免计算过程中溢出。
例如,若调用 fastPow(2, 10, 1000000007)
,则返回结果为 1024
。
这是本蒟蒻的第三篇题解,望多多支持!