引入公式

(a*b) %c = ((a % c)*(b % c)) %c

普通求幂的解法

 public static int pow(int x,int n) {int result = 1;for (int i = 0; i < n; i++) {result = result * x;}return result;}

这种写法的时间复杂度为 O(n),使用快速幂就能将时间复杂度降到O(log2n)

概念

顾名思义,快速幂就是一种快速计算底数的n次幂,它的时间复杂度可以达到O(log2N),和普通的相乘法效率有了非常大的提升

比如我们要算 2的 10 次方,怎么算才快?

  1. 最直观的方法就是 2*2=4,4*2=8,8*2=16 … 一直乘到第十个2,一共进行了9次相乘
    于是出了如下代码

  2. 先算 2的5次方再算2的5次方的平方,(25)2,一共进行了 5次相乘

  3. 先算 2*2=4,再计算 2的5次方 4*4*2,再计算2的五次方的平方,(((22)2)*2)2,一共进行了4次乘法

引入二进制

快速幂通过二进制的位运算来理解
求 xn,比如求 210
如果把10变成二进制,那么就是 1010,于是就可以写出下面的式子
0*20 + 1*22 + 0*22 + 1*23

最后得出下面的式子

2^(0*2 0 + 1*22 + 0*22 + 1*23 )

通过化简得到

2^(2^1) * 2^(2^3)

也就是二进制为上为0的数被忽略了

那么我们在求 210的时候,就可以利用上面的解法

  • 在计算的时候不断获取指数的每一个二进制位
  • 如果二进制位为0,说明这一位无效,就把二进制位累成就好了
  • 如果二进制位位1说明是有效数字,把累乘的结果和最后的结果相乘

实现代码

public static int pow(int x,int n) {int result = 1; //结果int index = x; //二进制位while (n != 0) {// 若果最后一位二进制为1说明是有效位// 把累乘的结果乘到结果中去if ((n&1) == 1) {result *= index;}index *= index;n>>=1;}return result;}

n =10,二进制表示就是 1010

  1. 首先从第一个二进制位开始,1010 第一个二进制是0,所以这一位不要,所以结果还是1,index变成 22
  2. 101最后一位是1,这个22这一位是要的,把它乘入 result,result=22,index变成 24
  3. 10最后一位又是0,所以这一位又可以忽略,index变成28
  4. 1最后一位是1,把它乘入 result (22*28),得到最后结果 210

快速幂取模

通过上面的公式

(a*b) %c = ((a % c)*(b % c)) % c

代码

// 1000000007是一个质数(素数),对质数取余能最大程度避免结果冲突/重复
static int mod = 1000000007;public static int pow(int x,int n) {int result = 1; //结果int index = x; //二进制位while (n != 0) {// 若果最后一位二进制为1说明是有效位if ((n&1) == 1) {result *= index;result %= mod;}index *= index;index %= mod;n>>=1;}return result;}

快速幂(快速幂取余)相关推荐

  1. 快速幂(取余) c++

    题意:求a的b次幂对p取余的结果 快速幂做法: #include<iostream> using namespace std; int main() {long long a,b,p;ci ...

  2. java取余位运算_java学习--高效的除模取余运算(n-1)hash

    没有测试过使用取余运算符和位运算符都做同一件事时的时间效率! 取余运算符% 如3除以2取余数 int a = a = a%; 结果为1 上面是传统的方式进行求余运算. 需要先将10进制转成2进制到内存 ...

  3. 洛谷——P1226 取余运算||快速幂

    P1226 取余运算||快速幂 题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 输入格式: 三个整数b,p,k. 输出格式: 输出"b^ ...

  4. 【面试相关】python实现快速幂取余算法详解

    假设我们要计算 2102^{10}210 对1000取模的结果,可以很简单的得到24.但是如果要求 210002^{1000}21000 对1000取模的结果,常规方法就行不通了,因为常规的变量无法容 ...

  5. 洛谷 1226 取余运算||快速幂

    洛谷  取余运算||快速幂 1226 其实比起楼下的大佬们,我主要是多了些位运算和讲解. 想法一: 直接输出 pow(b,q)%k 嗯~~勇气可嘉,但是看一眼数据范围(长整型)就会意识到,这个方法也许 ...

  6. 【数学】幂运算与快速幂取余

    一.幂运算 1.幂的定义: 的幂就是多个相乘,记作,表示的次幂,即个相乘,我们把叫做底数,叫做指数. 2.幂的运算: 我们可以用公式将幂运算进行简化,公式如下: 3.求幂方法: (1). Python ...

  7. Python实现快速幂取余算法

    引子 今天无意中,看到了慧科教育科技集团有限公司-后厂理工学院 的AI相关学员招募信息,要求颇高,还要做编程自测题,并且达到60分才建议进行课程的学习.我忍不住发送了报名信息,得到了自测题.看到了如下 ...

  8. 取余运算(mod,快速幂)

    [题目描述] 输入b,p,k的值,求bpmodk的值.其中b,p,k×k为长整型数. [输入] 输入b,p,k的值. [输出] 求bpmodk的值. [输入样例] 2 10 9 [输出样例] 2^10 ...

  9. 快速幂取余算法总结详解

    废话不多说, 直接步入正题. 现在oj网站的题或者竞赛的题,如果a的b次幂且b很大,那么题中大多会让你把结果对一个数取余也就是求模,例如a^b%c这种,当然如果是考高精度的题除外. 接下来我将提供一种 ...

最新文章

  1. XSLT教程 [转]
  2. Lync 2010迁移Lync 2013 PART6:迁移CMS
  3. android 图片操作
  4. Java中classLoader浅析
  5. java final修饰属性_Java final关键字用来修饰类、方法、属性
  6. java禁止js获取cookie_java中Cookie被禁用后Session追踪问题
  7. 200 行代码实现一个滑动验证码
  8. 浅谈UWB室内定位(三)_vortex_新浪博客
  9. 三 Hibernate持久化状态主键生成策略
  10. WGS84坐标系-地心地固坐标系-东北天坐标系
  11. Altium 怎么设置鼠标滚轮放大缩小
  12. Java单词首字母小写转大写
  13. WZOI-218疯狂吃鸡腿1
  14. win7 防火墙开启ping
  15. 使用TkMybatis逆向生成带中文注释文件,并使用其常用的方法
  16. 程序员的算法趣题Q68: 异性相邻的座位安排(1)
  17. 办公软件 office
  18. 18款奔驰C200L升级柏林之声音响,音质享受,驾驶乐趣
  19. 资金指数(ZJZS)指标
  20. 关于级联选择器Cascader数据太多会改变列表大小的问题

热门文章

  1. 200smart电机控制程序,三相异步电动机正反转
  2. 关于Spring嵌套事务异常问题
  3. Sqlite delete语句使用注意点
  4. LayaBox CommandBuffer描边使用详细
  5. 知识付费社群运营怎么做?
  6. chatgpt赋能python:Python如何分成两栏写入Word文档
  7. strtoul()函数
  8. 如何完美删除Visual Studio?
  9. Xcode使用教程详细讲解(下)
  10. 人力成本 HR cost