快速幂
a b a^b ab
long long Pow(long long a, long long b) {
long long ans = 1;
for (int i = 0; i < b; i++)
ans = ans * a;
return ans;
}
由于指数爆炸的原因,所以题目一般求 a b % m o d a^b \% mod ab%mod;使用快速幂可以更快的求出结果,它基于二分的思想,所以也称为二分幂:
- 如果b是奇数,有 a b = a ∗ a b − 1 a^b = a * a^{b - 1} ab=a∗ab−1
- 如果b是偶数,有 a b = a b / 2 ∗ a b / 2 a^b = a^{b/2} * a^{b/2} ab=ab/2∗ab/2
对于 2 10 2^{10} 210
- 2 10 2^{10} 210,10为偶数, 2 10 = 2 5 ∗ 2 5 2^{10} = 2^5 * 2^5 210=25∗25
- 2 5 2^5 25,5为奇数, 2 5 = 2 ∗ 2 4 2^5 = 2 * 2^4 25=2∗24
- 2 4 2^4 24,4为偶数, 2 4 = 2 2 ∗ 2 2 2^4 = 2^2 * 2^2 24=22∗22
- 2 2 2^2 22,2为偶数, 2 2 = 2 1 ∗ 2 1 2^2 = 2^1 * 2^1 22=21∗21
- 2 1 2^1 21,1为奇数, 2 1 = 2 ∗ 2 0 2^1 = 2 * 2^0 21=2∗20
- 递归结束条件: 2 0 = 1 2^0 = 1 20=1
当b是奇数时,总有(b - 1)为偶数,很容易想到使用递归实现快速幂。开篇中long long
的使用显得代码臃肿,所以使用关键字typedef
减少代码量
typedef long long ill;
ill binaryPow(ill a, ill b, ill mod) {
//递归结束条件,递归到 2^0 = 1
if (b == 0) return 1;
if (b % 2 == 1)
return a * binaryPow(a, b - 1, mod) % mod;
else {
ill mul = binaryPow(a, b / 2, mod);
return mul % mod * mul % mod;
}
}