快速幂 概念及模板

快速幂

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

原理

以下以求  a的b次方 来介绍

把b转换成二进制数。该二进制数第i位的权为
例如b=11:
11的二进制是1011
11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1
因此,我们将a¹¹转化为算
                                
 
实现
快速幂可以用位运算来实现
and    1  {也就是取b的二进制最低位(即第0位) 判断b是否为奇数,是则为1}
shr 1  {就是去掉b的二进制最低位(即第0位)}
 
c++实现
 
b & 1   //取b二进制的最低位,判断和1是否相同,相同返回1,否则返回0,可用于判断奇偶
b >> 1  //把b的二进制右移一位,即去掉其二进制位的最低位
 
 
快速幂加取模模板
 
ll pow(ll n,ll m)
{
    ll ans = 1;
    while(m > 0)
    {
        if(m & 1)ans = (ans * n) % mod;
        m = m >> 1;
        n = (n * n) % mod;
    }
    return ans;
}
代码比较

常规求幂

1 int pow1(int a,int b){
2    int r=1;
3    while(b--) r*=a;
4    return r;
5 } 

快速求幂(一般)

1 int pow2(int a,int b){
2     int r=1,base=a;
3     while(b!=0){
4     if(b%2) r*=base;
5     base*=base;
6     b/=2;
7     }
8     return r;
9 }

 

快速求幂(位运算)

 1 int pow3(int x,int n){
 2   if(n==0) return 1;
 3   else {
 4     while((n&1)==0){
 5       n>>=1;
 6       x*=x;
 7     }
 8   }
 9   int result=x;
10   n>>=1;
11   while(n!=0){
12     x*=x;
13     if(n&1) result*=x;
14     n>>=1;
15   }
16   return result;
17 }

 

快速求幂(位运算,更简洁)

1 int pow4(int a,int b){
2   int r=1,base=a;
3   while(b){
4     if(b&1) r*=base;
5     base*=base;
6     b>>=1;
7   }
8   return r;
9 }

参考: 百度百科

原文地址:https://www.cnblogs.com/stranger-/p/7275761.html