快速幂的想法

10 分钟

,一个个乘要乘 次, 很大就慢。快速幂的想法:与其一次翻一倍指数地慢慢加,不如"平方"着翻——先算 ,再平方得 ,再平方得 指数每次翻倍,几步就冲到很大。

从 2 开始连续平方:,即 ,4 步就到 。一般地,把指数 看成二进制:哪一位是 1,就把对应的那个平方项乘进答案。

long long qpow(long long a, long long b, long long p) {
    long long res = 1;
    a %= p;
    while (b > 0) {
        if (b & 1) res = res * a % p;  // 当前二进制位是 1
        a = a * a % p;                 // 底数平方
        b >>= 1;                       // 指数右移一位
    }
    return res;
}

复杂度 也只需约 60 步。常见坑:resa 都要开 long long 并每步取模防溢出;b 用右移逐位处理,别漏了 a=a*a 那一步;底数先 a %= p 一下更稳。

小纸条

从 2 开始连续平方,几步能到 2 的 16 次方?

登录 后可看答案

快速幂的想法 · 考级冲刺 · op599 课程