所谓的快速幂,其目的是为了快速求幂,将时间复杂度从朴素算法的O(n)降到O(logn)。
假如现在要求 a^b,按照朴素算法,就是将a连乘b次,时间复杂度为O(b),即O(n)级别。
是一个将指数不断除以2,底数不断乘方的过程(指数为奇数要变成偶数)。
举例:
int quick_pow(int a, int b) {
int ans = 1, base = a;
while (b) {
if (b & 1) {
ans = ans * base;
}
base = base * base;
b >>= 1;
}
return ans;
}
快速幂取模
// time:O(logN)
// 这里不考虑指数为负数的情况
int pow_mod(int a, int b, int c) {
int ans = 1, base=a; // ans:结果;base:底数
base = base % c;
// 考虑0次方的情况
if(b==0) {
return 1 % c; // 任意a的0次幂都是1,故直接用1%c即可
}
while(b) {
if(b & 1) // 与运算,判断奇偶性
ans = (ans * base) % c;
base = (base * base) % c;
b = b >> 1; // 右移一位,相当于除2
}
return ans;
}