转自: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时,a^11=a^(2^0+2^1+2^3)

  11的二进制是1011,11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1,因此,我们将a¹¹转化为算 a^(2^0)*a^(2^1)*a^(2^3) ,看出来快的多了吧原来算11次,现在算三次,但是这三项貌似不好求的样子....不急,下面会有详细解释。

  由于是二进制,很自然地想到用位运算这个强大的工具: &  和 >> ,&运算通常用于二进制取位操作,例如一个数 & 1 的结果就是取二进制的最末位。还可以判断奇偶x&1==0为偶,x&1==1为奇。>>运算比较单纯,二进制去掉最后一位,不多说了,先放代码再解释。
 int poww(int a,int b){
int ans=,base=a;
while(b!=){
if(b&!=)
  ans*=base;
base*=base;
b>>=;
  }
return ans;
}

  代码很短,死记也可行,但最好还是理解一下吧,其实也很好理解,以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某个数啊自己看着办。

  还有,矩阵快速幂的求法唯一的区别就是*换成矩阵中的乘法,写个函数代换嘛,思想一毛一样。

最新文章

  1. 【转载】兼容php5,php7的cURL文件上传示例
  2. javascript arguments解释,实现可变长参数。
  3. 数组方法slice()把类数组转成数组和复制一个数组
  4. python 【第三篇】:函数及参数
  5. 三大开源运维监控工具zabbix、nagios、open-falcon优缺点比较
  6. c语言计算过程中的过程转换
  7. [2019BUAA软工助教]结对编程 - 小结
  8. nginx简单权限配置
  9. 一个可遇不可求的 bug 全局变量初始化顺序问题 哈哈
  10. CentOS Linux release 7.3破解密码详解
  11. Qt中(图片)资源的使用方式
  12. 纯css3无缝滚动
  13. Android ActionBar使用介绍
  14. Python Socket 编程示例 Echo Server
  15. 树状数组套trie 模板
  16. AGS API for JS代理页的使用
  17. Apache与Tomcat联系及区别
  18. HTML的相关路径与绝对路径的问题---通过网络搜索整理
  19. cocos2dx 3.13 etc1 ClippingNode Bug 修正
  20. Word中调整编号和文字的间距

热门文章

  1. 20155212 2016-2017-2 《Java程序设计》第5周学习总结
  2. 20155218 《Java程序设计》实验二(Java面向对象程序设计)实验报告
  3. 与Linux的第一次遭遇
  4. 20155323 2016-2017-2 《Java程序设计》第3周学习总结
  5. 【JUC源码解析】PriorityBlockingQueue
  6. R Language Learn Notes
  7. [.NET] 使用HttpClient操作HFS (HTTP File Server)
  8. 一个IP可以登几个拼多多后台 拼多多如何推广营销
  9. Java接口获取系统配置信息
  10. CentOS7使用阿里源安装最新版Docker