基本概念

什么是快速幂呢?个人理解,就是更快速的计算幂运算。
比如计算a^b
刚学这个算法的时候我也很疑惑,幂运算不是有现成的公式么,直接pow(a,b)不就好了吗?
后来才明白,pow(a,b)的时间复杂度是O(b),即每次乘b,都得再运算一次。
如果b的值很大,那么代码的运行时间会很长,很多题目会疯狂时间超限。
而快速幂算法的时间复杂度是O(logb),可以有效减少运行计算机计算的次数。

例子

下面我举个简单小的例子:
计算2^32(a=2,b=32)
2*2=2^2;
2^2 *2^2 =2^4;
2^4 *2^4 =2^8;
2^8 *2^8 =2^16;
2^16 *2^16 =2^32;
时间复杂度优化为O(log32)
可以认为,这个算法基于倍增原理,与其每次逐个乘,不如每次将a的值翻倍

当b是2的整数幂时,计算很简单,可是若b不是2的整数幂时该怎么办呢?

下面再举一个小例子:
计算5^105
这个时候,虽然105不是2的幂,但是我们可以把它写成2的幂的和。
105,1+8+32+64=2^0 + 2^3,+ 2^5+ 2^6
这个算法的关键就是我们如何把b分解为2的幂之和
下面列一个表,从二进制的角度来分解这个问题
首先,105,1, 8,32,64这5个数的二进制表示:

很明显,105每个二进制位中的1和下面的数的二进制位中的1是一一对应的
我们通过这种方式,将b分解为2的幂的和
伪代码

fun(a,b)
sum=1
while b!=0
if(n%2==1)
sum=sum*a
a=a*a
b=n/2

从b的初始值开始,对b的每一个二进制位进行遍历,如果该位等于一,则让sum乘以a

下面是快速幂的代码

const long long m=1e9+7;
long long quickpow(long long a,long long b){long long sum=1;while(b){if(b&1)//与运算,可判断奇偶,详细见注释sum=sum*a%m;//取模运算a=a*a%m;b>>=1;//位运算,右移,相当于除以2}return sum;
}

PS:
第一条:

“&”是与运算
n&1 与运算 可以判断n是否为偶数 如果是偶数,n&1返回0;否则返回1,为奇数
第二条:
左移1位相当于乘以2,左移运算符“<<”;
右移1位相当于除以2,右移运算符“>>”;
本题中b>>=1,相当于b=b/2
第三条:
关于取模运算,大家可自行百度

例题

神秘钥匙
链接:https://ac.nowcoder.com/acm/problem/20701
来源:牛客网

clccle一行

快速幂算法(C++)相关推荐

  1. 六十八、快速幂算法、牛顿迭代法、累加数组+二分查找的变形

    @Author:Runsen 编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化. ---- Runsen 上次介绍了二分查找算法及其四个变形问题,下面介绍二分法常用的场景和典 ...

  2. 快速幂算法相关题目(Leetcode题解-Python语言)

    50. Pow(x, n) 快速幂算法的目的,就是快速计算 x 的 n 次方.基本思路是把 n 视作二进制数,则 n 可以被分解为多个 2 的幂次方之和,如 12 对应 1100 等于 0∗20+0∗ ...

  3. 【复习】快速幂算法详解

    快速幂算法 就是求一个高精度幂次取余时的一个快速算法 比如我们要求aba^bab%m的时候 应用于快速幂算法 也就是将O(n)转化为O(logn)的算法 他的原理就是: 252^525 = 2∗2∗2 ...

  4. java位运算求幂,程序员必学:快速幂算法

    前阵子,有小伙伴在我B站的算法教程底下留言 小伙伴们有任何疑问或者希望我解说任何内容,都可以在我的小我私家B站或民众号(xmg_mj)留言哦,我会尽我最大能力.只管抽时间去写文章\录视频来回应人人. ...

  5. 【算法分析与设计】快速幂算法与快速幂取模算法

    文章目录 快速幂算法 算法分析 算法实现 位运算优化 BigInteger支持 快速幂取模算法 算法优点 算法推导 算法实现 BigInteger支持 本文完整代码实现(Java语言描述) 快速幂算法 ...

  6. python快速幂算法解决大数取模

    1.前置性质 模运算的性质 [(a mod n)×(b mod n)] mod n = (a×b) mod n 指数可以拆分成二进制的形式,如9拆分成 1001 根据二进制的计算,1001 = ((1 ...

  7. 你必须掌握的,快速幂算法

    文章目录 1. 使用快速幂算法实现Pow(x,n) 2. 快速幂取余 1. 使用快速幂算法实现Pow(x,n) 求x的n次方,可以使用暴力解法,这种算法时间复杂度为O(n),并且,当x和n比较大的时候 ...

  8. RSA密码的手动算法+快速幂算法

    公钥加密方案(非对称加密算法) 1.为什么要引入公钥加密方案? 密码学中的加密方案分成对称密钥和非对称密钥(也就是我们说的公钥加密,代表加密算法是RSA加密算法). 而对称加密方法有一个特点,任何通信 ...

  9. LeetCode50——一题学会快速幂算法

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode的第31篇文章,我们来看下LeetCode的第50题,求一个数的幂. 题意 这道题的题意只有一句话,就是给定两个数x和 ...

  10. 快速幂算法 超详细教程

    快速幂 求幂运算 快速幂引入 快速幂 二进制 快速幂 指数折半 快速幂的应用 求幂运算 求幂运算大家都不陌生,幂是指数运算的结果,当m是正整数时nᵐ的意义为m个n相乘,n的m次幂也就是n的m次方.用代 ...

最新文章

  1. 图灵新浪微博赠书活动
  2. RESTful 架构
  3. hibernate11--Criteria查询
  4. Spark面试题梳理
  5. 电容充放电原理图_HDI滤波电容FANOUT案例
  6. Android Q分区存储权限变更及适配
  7. 实现折叠工具栏CollapsingToolbarLayout(折叠工具栏布局)
  8. 四 国内IP核相关企业及其分析
  9. mysql怎么做纵表,本文实例讲述了MySQL横纵表相互转化操作实现方法。分享给大家供大家参考,具体如下:先创建一个成绩表(纵表)create table user_scor...
  10. 电脑取消撤销快捷键是什么_电脑撤销快捷键是什么?这个万能快捷键适合各种电脑软件...
  11. 微信小程序之网易云音乐(五)- 排行详情页、歌单详情页、播放器组件开发
  12. 高级变量类型 ------- 列表、元组、字典
  13. 北洋雷达UST-10LX基于ROS都安装使用测试小问题
  14. 电脑强制删除顽固文件
  15. altera fpga 型号说明_ALTERA的FPGA命名规则
  16. HackTheBox-Machines-Precious
  17. python求积分_利用python的sympy求解微积分
  18. Zephyr网络协议
  19. 在C4D中如何切换中英文
  20. 优盘格式化工具,U盘修复格式化卡死问题

热门文章

  1. 关于BigInteger和BigDecimal
  2. html怎么建立css文件,怎么创建css文件
  3. 基于惯性动捕的动画应用解决方案——MAYA篇
  4. Tushare原学习文档(七 龙虎榜数据)
  5. 总结:K8S之服务注册与发现
  6. 【问题求助】PS调色师要学的东西!
  7. IDEA Android Studio 配置
  8. 【计算机问题】 火狐浏览器不能下载东西
  9. uniapp微信小程序复制电话或者文字
  10. OEM一款小领域暴力产品,年赚百万其实很容易实现