跳过并跳转到主要内容
BigO

快速幂

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

基础算法1分钟阅读
快速幂原理推导,利用指数二进制分解实现幂运算
快速幂原理推导,利用指数二进制分解实现幂运算

简单来说,快速幂(Fast Power / Binary Exponentiation) 是一种用极快速度计算 aba^b(aa 的 bb 次方)的神仙算法。

如果你用常规的循环相乘,算 aba^b 需要乘 bb 次,当 bb 特别大(比如 101810^{18})时,程序就会直接运行超时(TLE)。而快速幂可以将时间复杂度从 O(b)O(b) 降到 O(log⁡b)O(\log b)。

快速幂的核心思想是:分治 + 二进制拆分。

举个例子,要计算 2102^{10}:

2×2×2×2×2×2×2×2×2×22 \times 2 \times 2 \times 2 \times 2 \times 2 \times 2 \times 2 \times 2 \times 2

我们可以把指数 1010 拆成二进制:10=(1010)2=8+210 = (1010)_2 = 8 + 2。

所以:

210=28×222^{10} = 2^8 \times 2^2

注意到 28=(((2)2)2)22^8 = (((2)^2)^2)^2 吗?我们不需要挨个乘,只需要把底数不断做平方(自乘):

  1. 21=22^1 = 2
  2. 22=42^2 = 4
  3. 24=162^4 = 16
  4. 28=2562^8 = 256

每一次底数自乘,指数就翻倍,这让我们只用了 4 次乘法就完成了原本需要 10 次的计算!

不管是奇数还是偶数,算法的处理逻辑如下:

  • 如果指数 bb 是偶数:ab=(ab/2)2a^b = (a^{b/2})^2
  • 如果指数 bb 是奇数:ab=a×ab−1a^b = a \times a^{b-1}

由于大数乘法很容易溢出,实际应用中通常会结合取模操作(Mod),也就是求 (ab) mod m(a^b) \bmod m。

在实际比赛或面试中,非递归(位运算)版本最受欢迎,因为它不需要栈空间开销,而且运行速度更快。

#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 的大小传统循环(约执行次数)快速幂(约执行次数)
100100100100 次77 次
1,000,0001,000,0001,000,0001,000,000 次2020 次
101810^{18}直接超时/卡死仅需约 6060 次

© 2026 三七开 · 一方通行,只管向前。

旅途由 Astro 驱动 · 主题 Chirping Astro