Appearance
快速幂
如何快速求
递归写法
根据乘方公式
- 边界条件:
; - 时间复杂度:
。
cpp
typedef long long LL;
LL Pow(LL a, LL b) {
if (!b) return 1; // 边界条件
LL res = Pow(a, b / 2);
if (b % 2 == 0) // b 是偶数
return res * res;
else // b 是奇数
return res * res * a;
}
递推写法
若
举个例子,
将
扫描
时间复杂度为
cpp
typedef long long LL;
LL Pow(LL a, LL b) {
LL res = 1;
while (b) {
if (b % 2 == 1) // 二进制下该位为 1
res *= a;
a *= a, b /= 2;
}
return res;
}
更多时候,需要求对
cpp
typedef long long LL;
LL Pow(LL a, LL b, LL m) {
LL res = 1;
while (b) {
if (b & 1) // 等价于 b % 2 == 1
res = (res * a) % m;
a = (a * a) % m;
b >>= 2;
}
return res;
}