快速幂
求\(a^n\):
传统做法:\(a \times a \times ...\times a\),时间复杂度O(n)
快速幂算法:
\(5^{13} \to 5 \times 5^6 \times 5^6 \to 5 \times 15625 \times 15625\) 复用相同的数
\(2^8 \to (2^4)^2 \to 2^4 \times 2^4\)
\(2^4 \to 2^2 \times 2^2\)
时间复杂度O(log(n))
而对应的幂使用二进制的位值\(x^{22}=x^{16}\times x^4\times x^2\),其中22的二进制为10110
模板
基本快速幂
typedef long long ll;
//base代表底数,power代表指数
ll fastPower(ll base, ll power) {
ll result = 1;
while (power) {
if (power & 1) { /*power按位与1,若结果为奇数,返回1(true),为偶数,
返回0(false)根本目的是判断此时指数的奇偶性*/
result = result * base;//逐位获取power的二进制位,遇0累乘
}
power >>= 1;/*power右移一位,即除二操作,此时不管奇偶,因为整数类型会删去小数部分*/
base *= base;
}
return result;
}
但当结果过大时题目一般会要求求模,即求 m^k mod p
long long qmi(int m, int k, int p)
{
long long res = 1 % p, t = m;
while (k)
{
if (k&1) res = res * t % p;
t = t * t % p;
k >>= 1;
}
return res;
}
高精快速幂