最近一场比赛又把快速幂给忘了,那么就写一次好了
首先,快速幂的目的就是做到快速求幂,假设我们要求a^b,按照朴素算法就是把a连乘b次,这样一来时间复杂度是O(b)也即是O(n)级别,快速幂能做到O(logn),快了好多好多。它的原理如下:
1.
快速幂是可以拆成二进制的
12=2^3 + 2^2==1100(2)
可知公式poww(a,b)=a^b ==a^(b拆成二进制)
那么a^12= =a^(2 ^ 3) * a^(2 ^ 2)= =a^8 * a^4
所以二进制的那一位是1对应2^(n-1)
2.&和>>的妙用
一个数 & 1 的结果就是取二进制的最末位。
还可以判断奇偶x&1== 0为偶,x&1==1为奇。
.>>运算比较单纯,二进制去掉最后一位.
那么根据这个原理可以放出我们的快速幂
int poww(int a, int b) {
int ans = 1, base = a;
while (b != 0) {
if (b & 1 != 0)
ans *= base;
base *= base;
b >>= 1;
}
return ans;
}