快速幂讲解
来源:互联网 发布:若星汉天空 知乎 编辑:程序博客网 时间:2024/06/06 17:44
转自http://www.cnblogs.com/CXCXCXC/p/4641812.html
快速幂这个东西比较好理解,但实现起来到不老好办,记了几次老是忘,今天把它系统的总结一下防止忘记。
首先,快速幂的目的就是做到快速求幂,假设我们要求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某个数啊自己看着办。
还有,矩阵快速幂的求法唯一的区别就是*换成矩阵中的乘法,写个函数代换嘛,思想一毛一样。。
- 快速幂讲解
- 快速幂讲解
- 快速幂讲解
- 快速幂讲解
- 快速幂讲解
- 快速幂讲解
- 快速幂讲解
- hdu3306矩阵快速幂讲解
- 初学快速幂详细讲解
- 快速乘法&快速幂&矩阵快速幂简单讲解
- 快速排序讲解+示意图
- 快速幂取模讲解&模板
- 快速排序简单讲解
- 快速排序讲解(粗略)
- 快速幂取余深度讲解
- 精准讲解 快速排序
- 葫芦娃关于快速幂流程的详细讲解
- gdb调试讲解,快速入门
- 【R笔记】基于R构建tensorflow框架实现神经网络
- C语言-类型转换
- 4G 频段的分配
- Django学习流程精简记录
- 《致橡树》 舒婷
- 快速幂讲解
- Linux for Complete Beginners
- poJ-1312 棋盘问题
- Ch2r_ood_understanding 本文档为论文限定领域口语对话系统中超出领域话语的对话行为识别的部分实验代码。代码基于Python,需要用到的外部库有: Keras(搭建神经网络) S
- CODEFORCES掉RATING记 #2
- 文本深度表示模型Word2Vec 简介 Word2vec 是 Google 在 2013 年年中开源的一款将词表征为实数值向量的高效工具, 其利用深度学习的思想,可以通过训练,把对文本内容的处理简
- nyoj-27-水池数目
- windows下安装elasticSearch5.X head插件
- 1125 交换机器的最小代价