快速幂可以在 O(log_n) 时间内完成 n 次幂的快速乘方的技巧,适用于 n 很大的情况。(一般直接乘需要 O(n) )
假设我们现在需要计算 3^{13}
我们可以先表示成二进制 3^{(1101)_2}
那么我们就可以进一步表示为: 3^8 \times 3^4 \times 3^1
如果我们可以快速知道 3 ^ 8, 3^4, 3^1 我们就可以在 O(log_n) 的时间内完成乘方。
当然本身就可以知道这些乘方是多少,举个例子:
3^8 = (3^4)^2
前面的哪一项永远是后一项的平方倍,所以我们可以在 O(1) 的时间内求出那些幂。
模板:
long long fast_pow(long long a, long long b)
{
long long res = 1;
while (b > 0)
{
if (b & 1)
res = res * a;
a = a * a;
b >>= 1;
}
return res;
}