Akvicor
Akvicor
发布于 2019-09-13 / 3 阅读
0
0

快速幂 a^b

根据数学常识,每一个正整数可以唯一表示为若干指数不重复的 2 的次幂的和。

也就是说,如果 b 在二进制表示下有 k 位,其中第 位的数字是 ,那么

于是

因为 ,所以上式乘积的数量不多于

又因为 ,所以很容易通过 k 次递推求出每个乘积项,当 时,把该乘积项累积到答案中

因此为了计算 ,我们只需要将对应二进制位为 1 的整系数幂乘起来就行了

LL quick_pow(LL a, LL b, LL p) {
    a %= p;
    LL res = 1 % p;
    for (; b; b >>= 1) {
        if (b & 1) res = res * a % p;
        a = a * a % p;
    }
    return res;
}


评论