快速幂

来源:互联网 发布:帝国cms 全站伪静态 编辑:程序博客网 时间:2024/06/11 21:14

源自百度百科:原文


快速幂

顾名思义,快速幂就是快速算底数的n次幂。其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高。


原理

以下以求a的b次方来介绍
把b转换成二进制数。
该二进制数第i位的权为
例如


11的二进制是1011
11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1
因此,我们将a¹¹转化为算

实现
快速幂可以用位运算来实现:
b & 1//取b二进制的最低位,判断和1是否相同,相同返回1,否则返回0,可用于判断奇偶
b>>1//把b的二进制右移一位,即去掉其二进制位的最低位

递归版:
ll pow(ll a,ll i)
{
  if(i==0) 
     return 1;
  int temp=pow(a,i>>1);
  temp=temp*temp%MOD;
  if (i&1)
     temp=(ll)temp*a%MOD;
  return temp%MOD;
}
非递归:
int pow4(int a,int b)
{
  int r=1,base=a;
  while(b)
  {
    if(b&1) r*=base;
    base*=base;
    b>>=1;
  }
  return r;
}


原创粉丝点击