快速幂
顾名思义,快速幂就是快速算底数的n次幂。其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高。
原理
以下以求 a的b次方 来介绍
把b转换成二进制数。该二进制数第i位的权为

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

实现
快速幂可以用位运算来实现
b
and
1
{也就是取b的二进制最低位(即第0位) 判断b是否为奇数,是则为1}
b
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 }
参考: 百度百科