根据数学常识,每一个正整数可以唯一表示为若干指数不重复的 2 的次幂的和。
也就是说,如果 b 在二进制表示下有 k 位,其中第
于是
因为
又因为
因此为了计算
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;
}