【快速幂详解】
来源:互联网 发布:广东省造价软件 编辑:程序博客网 时间:2024/06/05 08:13
快速幂这个东西比较好理解,但实现起来到不老好办,记了几次老是忘,今天把它系统的总结一下防止忘记。
首先,快速幂的目的就是做到快速求幂,假设我们要求a^b,按照朴素算法就是把a连乘b次,这样一来时间复杂度是O(b)也即是O(n)级别,快速幂能做到O(logn),快了好多好多。它的原理如下:
假设我们要求a^b,那么其实b是可以拆成二进制的,该二进制数第i位的权为2^(i-1),例如当b==11时
1 int poww(int a,int b){ 2 int ans=1,base=a; 3 while(b!=0){ 4 if(b&1!=0) 5 ans*=base; 6 base*=base; 7 b>>=1; 8 } 9 return ans;10 }
代码很短,死记也可行,但最好还是理解一下吧,其实也很好理解,以b==11为例,b=>1011,二进制从右向左算,但乘出来的顺序是 a^(2^0)*a^(2^1)*a^(2^3),是从左向右的。我们不断的让base*=base目的即是累乘,以便随时对ans做出贡献。
其中要理解base*=base这一步,看:::base*base==base^2,下一步再乘,就是base^2*base^2==base^4,然后同理 base^4*base4=base^8,,,,,see?是不是做到了base-->base^2-->base^4-->base^8-->base^16-->base^32.......指数正是 2^i 啊,再看上 面的例子,a¹¹= a^(2^0)*a^(2^1)*a^(2^3),这三项是不是完美解决了,,嗯,快速幂就是这样。
顺便啰嗦一句,由于指数函数是爆炸增长的函数,所以很有可能会爆掉int的范围,根据题意决定是用 long long啊还是unsigned int啊还是mod某个数啊自己看着办。
还有,矩阵快速幂的求法唯一的区别就是*换成矩阵中的乘法,写个函数代换嘛,思想一毛一样。。
using namespace std;
int ans=1,base=a; //栗子 2^11
while(b!=0){
//判断最低位是 0 还是1
if(b&1!=0) ans*=base; //相当于 a^(2^0*最低位)*a^(2^1*最低位) 两个最低位都为1
base*=base;
b>>=1;//二进制除去最后一位
}
return ans;
}
int main(){
int n,m;
cin>>n>>m;
cout<<poww(n,m)<<endl;
return 0;
}
- 快速幂详解
- 快速幂 -- 算法详解
- 快速模幂详解
- 矩阵快速幂详解
- 【快速幂详解】
- 快速幂算法详解
- 快速乘法/幂 算法详解
- 矩阵快速幂 非详解
- 算法提高快速幂(快速幂算法详解)
- 快速幂 矩阵快速幂思想详解及例题
- 快速幂的详解(转载)
- 快速幂详解以及例题解析
- 快速幂详解——codevs 1497
- 暗黑破坏神快速RR详解
- 快速排序详解
- 快速排序(详解)
- 快速排序法详解
- 快速排序详解
- angularjs分页
- 给Ubuntu 17.04打Preempt Rt补丁
- ksoap2_WebService客户端调用
- Error: Could not find an installed version of Gradle either in Android Studio
- uva 1398
- 【快速幂详解】
- MAPREDUCE 编程模型理解
- JDBC回顾
- iphone 6s无sim卡
- 【opencv学习之十二】opencv滑条及实例
- 安卓应用版本更新的一些逻辑整理
- (六)数据结构之二叉树的简单实现
- Spring MVC学习总结(17)——SpringMVC之接口规范与Controller规范
- MySql大小写默认不敏感