快速幂

计算a^b

正常用a*a*a*a……乘b次,时间复杂度为O(b)

用快速幂呢,就可以优化为O(log2 b)

 

例如

11的二进制是1011

 11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1

因此,我们将a¹¹转化为算

也就是如果这一位二进制为1,在结果里乘上2的这一位次幂

反之则不乘

那么结果就是所有这些幂的乘积

 

 

b&1//取b二进制的最低位,判断和1是否相同,相同返回1,否则返回0,可用于判断奇偶,可以用b%2!=0代替
b>>1//把b的二进制右移一位,即去掉其二进制位的最低位,可以用b/=2代替

 

递归版

1 long long pow(long long a,long long i){
2   if (i==0) return 1;
3   int temp=pow(a,i>>1);
4   temp=temp*temp%MOD;
5   if (i&1) temp=(ll)temp*a%MOD;
6   return temp%MOD;
7 }

 

非递归版

 1 long long f(long long a,long long b,long long n)
 2  {
 3      int t,y;
 4      t=1; 
 5      y=a;
 6      while (b!=0)
 7     {
 8          if (b&1==1) t=t*y%n;//如果是奇数(这一位二进制是一),那么乘上去
 9          y=y*y%n; //把a本身平方,算二进制下一位对应的2的次幂
10          b=b>>1;//b=b/2
11    }
12     return t;
13 }

 

posted @ 2018-12-02 10:56  yyyr  阅读(85)  评论(0编辑  收藏  举报