快速幂

又填补一个知识盲区

计算a的b次方,如果b是大于1的。如果使用b个a相乘的来计算pow(a,b)的话,就进行了b次计算。时间复杂度是o(n)。

不过a^b=a^(b/2) * a^(b/2),如果把a^(b/2)计算出来,再计算它的平方,那计算次数就少了一半。

可以看到这n次计算其实有部分是重复的,能否把计算次数降低到o(n)以下呢?

如果把b表示为2的几次多项式,例如b=11时,b=2³×1 + 2²×0 + 2¹×1 + 2º×1。

那么a^b=a^(2^0)*a^(2^1)*a^(2^3),这样计算了3次乘法,三个幂指数。如果三个幂指数的值是可以复用,那么就可以减少计算次数了。

 

好了,快速进行幂指数计算的思想就是:尽量减少幂的次数,重复使用低次幂的值。 

int poww(int a,int b){
    int ans=1,base=a;
    while(b!=0){
        if(b&1!=0)
          ans= (ans*base)%(1e9+7);
        base=(base*base)%(1e9+7);
        b>>=1;
  }
    return ans;
}

 

posted @ 2020-03-24 21:19  isYiming  阅读(154)  评论(0编辑  收藏  举报