快速幂

快速幂

快速幂的作用就是快速算底数的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 }
View Code

 

posted @ 2017-06-03 09:49  江屿  阅读(181)  评论(0编辑  收藏  举报