快速幂原理详解

快速幂可以在 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;
}