快速幂
快速幂
快速幂的作用就是快速算底数的n次幂。它的时间复杂度只有O(logN),比正常的O(N)的算法的速度快了不少。
快速幂是二进制的应用。即把该数的指数化为2的各个次方的乘积的形势,达到优化时间的目的。
例如:
2^11=2048。
11的二进制为1011。
11=2^0*1+2^1*1+2^2*0+2^3*1=2^0+2^1+2^3。
所以2^11=2^(2^0+2^1+2^3)。
这样一来,时间复杂度就降低了。
那么我们怎么使用程序实现呢。
我们可以用(b&1)来求出二进制的最后一位,用(b>>=1)来表示删掉二进制的最后一位。
每次计算二进制的最后一位,就可以实现快速幂了。
代码:
1 #include<cstdio> 2 #define ll long long 3 ll x,y,mod; 4 ll pow(ll a,ll b){ 5 ll x=1,y=a; 6 while(b){ 7 if(b&1) 8 x=x*y%mod; 9 y=y*y%mod; 10 b>>=1; 11 } 12 return x; 13 } 14 int main(){ 15 scanf("%lld%lld%lld",&x,&y,&mod); 16 printf("%lld",pow(x,y)); 17 return 0; 18 }