快速幂
快速幂借助指数的二进制拆分,把 a 的 b 次方的时间复杂度从 O (b) 优化到 O (log b)。不断对底数平方,当指数二进制位为 1 时就把当前底数乘入答案,常搭配取模处理大数,高效计算大指数的模值。
基础算法1分钟阅读

简单来说,快速幂(Fast Power / Binary Exponentiation) 是一种用极快速度计算 ( 的 次方)的神仙算法。
如果你用常规的循环相乘,算 需要乘 次,当 特别大(比如 )时,程序就会直接运行超时(TLE)。而快速幂可以将时间复杂度从 降到 。
快速幂的核心思想是:分治 + 二进制拆分。
举个例子,要计算 :
我们可以把指数 拆成二进制:。
所以:
注意到 吗?我们不需要挨个乘,只需要把底数不断做平方(自乘):
每一次底数自乘,指数就翻倍,这让我们只用了 4 次乘法就完成了原本需要 10 次的计算!
不管是奇数还是偶数,算法的处理逻辑如下:
- 如果指数 是偶数:
- 如果指数 是奇数:
由于大数乘法很容易溢出,实际应用中通常会结合取模操作(Mod),也就是求 。
在实际比赛或面试中,非递归(位运算)版本最受欢迎,因为它不需要栈空间开销,而且运行速度更快。
#include <iostream>
long long fast_power(long long a, long long b, long long m) { long long ans = 1; a %= m; while (b > 0) { if (b & 1) ans = (ans * a) % m; // 如果是奇数/最低位为1 a = (a * a) % m; // 底数自乘 b >>= 1; // b 除以 2 } return ans;}| 指数 b 的大小 | 传统循环(约执行次数) | 快速幂(约执行次数) |
|---|---|---|
| 次 | 次 | |
| 次 | 次 | |
| 直接超时/卡死 | 仅需约 次 |