浅谈快速幂
简介
快速幂就是快速算底数的n次幂。其时间复杂度为 O ( l o g ₂ N ) O(log₂N) O(log₂N), 与朴素的 O ( N ) O(N) O(N)相比效率有了极大的提高。
那么,朴素的代码是什么样的呢?
(为防止初学蒟蒻乱闯,这里推荐朴素的快速幂)
设一个数ab
把b转换成二进制数。
该二进制数第i位的权为2i-1
11的二进制是1011
11=23×1+22×0+21×1+20×1
我们就可以将a11进行转化
这样会使计算变快很多。
主要实现方法
b&1
这一步是取b二进制的最低位,判断和1是否相同,相同返回1,否则返回0,可用于判断奇偶
b>>1
这一步把b的二进制右移一位,即去掉其二进制位的最低位,计算其二进制位的下一位
代码对比
常规求幂
int pow(int a,int b){
int r=1;
while(b--) r*=a;//求值
return r;
}
快速求幂
int pow(int x,int y)
{
int ans=1,cnt=x;
while(y)
{
if(y&1) ans*=cnt;//判断
cnt*=cnt;//求值
y=y>>1;//传递至下一步操作
}
return ans;
}
很明显,快速求幂比常规求幂所运行的循环要少得多,在数据大的时候甚至可以比常规求幂快出1s(我口胡的)
正如世界上某名人所说:
没有最快,只有更快
(提示:快速幂与矩阵乘法搭配,也就是矩阵快速幂,有神奇的效果 O O O)
总结
作为参加NOIP的我们,快速幂是必定要会的(除非你是巨佬)作为一种被大家广泛使用的小技巧,快速幂可以用于加快各种代码的运行速度(除非死循环),可以把你从TLE拉成AC(或是CE,RE和WA)。