快速幂就是快速算底数的n次幂。 其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高。
假设我们要求a^b,那么其实b是可以拆成二进制的,该二进制数第i位的权为2^(i-1),例如当b==11时 ,a11=a(2^0+2^1+2^3)
11的二进制是1011,11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1,因此,我们将a¹¹转化为算 a2^0*a2^1*a2^3,也就是a1*a2*a8
上代码:
#include<iostream>
using namespace std;
int Power(int a, int b){
int ans = 1;
while(b > 0){
if(b&1){
ans *= a;
}
b >>= 1; //二进制的移位操作,相当于每次除以2,用二进制看,就是我们不断的遍历b的二进制位
a = (a * a); //不断的加倍
}
ans %= c;
return ans;
}
int main()
{
int a, b, c;
cin >> a >> b >> c;
cout << Power(a, b) << endl;
return 0;
}
我们首先剖析一下每一行的代码,首先b为11,则二进制为1011
b&1表示如果b为奇数的时候b&1==1,我们计算的时候只需要把11 的二进制不是0的进行乘幂操作,进行一次b>>1,表示除以2
然后进行加倍。
其中要理解a*=a这一步:因为 a*a==a^2,下一步再乘,就是a^2*a^2==a^4,然后同理 a^4*a^4=a^8,由此可以做到a-->a^2-->a^4-->a^8-->a^16-->a^32.......指数正是 2^i ,再看上面的例子,a¹¹= a1*a2*a8,这三项就可以完美解决了,快速幂就是这样。