快速幂 OI Wiki 参考
原理:https://blog.csdn.net/lff0305/article/details/50193173
- 把乘方数,转换为以2为基底的一个乘方数;
- 把多个数相乘,转换为自乘,来快速升高幂次数。
代码实现
//递归方式
long long binpow(long long a, long long b) {
if (b == 0) return 1;
long long res = binpow(a, b / 2);
if (b % 2)
return res * res * a;
else
return res * res;
}
非递归方式
第二种实现方法是非递归式的。它在循环的过程中将二进制位为 1 时对应的幂累乘到答案中。尽管两者的理论复杂度是相同的,但第二种在实践过程中的速度是比第一种更快的,因为递归会花费一定的开销。
long long binpow(long long a, long long b) {
long long res = 1;
while (b > 0) {
if (b & 1) res = res * a;
a = a * a;
b >>= 1;
}
return res;
}
详情参考快速幂