1.快速幂

一般的,我们都知道求只需要连续乘3次2就能得到,那么等于多少呢?其实这个一很简单,不就是13个2相乘吗,连续乘13次2就行了。那么,呢? 是不是要连续乘100次、1000次,我们将这类问题归结为求。那么当b很大的时候,是很浪费时间的,往往会造成超时,那有没有更快的计算方法呢?当然了,接下来就是这篇文章的重点:快速幂

我们以b=13为例,将b表示为二进制:

那么:

那么我们观察只要b的2进制的第i位为1,就乘上(这个值可以在循环中得到)。
大家可以发现,这样计算要比普通的连乘计算要简单快速的多,如果你要计算,连乘要计算10000次,而快速幂大概要计算次。这就是快速幂算法,它将幂次运算由O(n)简化到了O().
快速幂充分利用了二进制的特点(非0即1),把十进制转化成二进制后再展开,对于每一位的当前结果要么乘要么不乘,把原本n次的循环变成了n的二进制位数的循环。

推广到
;
.

代码:

typedef long long ll;
ll _power(ll a, int b, int p) { //计算(a^b)%p;ll ans = 1;while (b) {if (b & 1) //等价于b%2,判断b的奇偶性ans = ans * a % p; //如果为奇数,证明该位为1,需要乘上aa = a * a % p; //计算a^(2^i)b >>= 1; //等价于b/=2;}return ans;
}

快速幂取模算法原理:(a * b) % p = ((a % p) * (b % p)) % p.
如果不需要取模,把取模运算去了就行了。

2.矩阵快速幂

矩阵快速幂和上面的快速幂原理是一样的,不同的是上面的那个是数,这个是矩阵而已。
直接上代码:

typedef long long ll;
const int mod = 1e9 + 7;
const int MAXN = 10005;//矩阵的大小
struct Mat {ll m[MAXN][MAXN];
}ans, a;//ans为结果矩阵,a为输入矩阵
Mat Mul(Mat a, Mat b, int n) {//计算矩阵a乘矩阵b,n为矩阵的大小Mat c;//临时矩阵cmemset(c.m, 0, sizeof(c.m));for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++)for (int k = 1; k <= n; k++)c.m[i][j] = (c.m[i][j] + (a.m[i][k] * b.m[k][j]) % mod) % mod;return c;
}
Mat _power(Mat a, int b, int n) {//计算a^b,n为矩阵的大小for (int i = 1; i <= n; i++)//构造单位矩阵ans[i][i] = 1;while (b) {if (b & 1)ans = Mul(ans, a, n);a = Mul(a, a, n);b >>= 1;}return ans;
}       

如果不需要取模,把取模运算去了就行了。

矩阵快速幂练习:
洛谷[luogu P3390]:https://www.luogu.org/problem/P3390
题解:https://blog.csdn.net/lzyws739307453/article/details/90146815/

矩阵快速幂应用:
洛谷[luogu P1939]:https://www.luogu.org/problem/P1939
题解:https://blog.csdn.net/lzyws739307453/article/details/90147196/

快速幂和矩阵快速幂详解+模板相关推荐

  1. 快速幂或者矩阵快速幂

    快速幂或者矩阵快速幂在算大指数次方时是很高效的,他的基本原理是二进制,下面的A可以是一个数也可以是一个矩阵(本文特指方阵),若是数就是快速幂算法,若是矩阵就是矩阵快速幂算法,用c++只需把矩阵设成一个 ...

  2. 二分幂,快速幂,矩阵快速幂,快速乘

    前言 二分幂,快速幂,矩阵快速幂在算大指数次方时是很高效的. 求 a^n 的值是多少?n是1到10^18次方的一个整数. 求一个数的n次方,朴素的算法就是直接for循环,一遍一遍的乘,a*a*a*a* ...

  3. JDBC学习笔记01【JDBC快速入门、JDBC各个类详解、JDBC之CRUD练习】

    黑马程序员-JDBC文档(腾讯微云)JDBC笔记.pdf:https://share.weiyun.com/Kxy7LmRm JDBC学习笔记01[JDBC快速入门.JDBC各个类详解.JDBC之CR ...

  4. Unity快速入门之二 GUI Transform 详解

    Unity快速入门之一 3D基础概念.Camera.Canvas RenderMode的几种方式对比_翕翕堂 Unity快速入门之二 GUI Transform 详解_翕翕堂 Unity快速入门之三 ...

  5. C/C++实现蛇形矩阵(超详解)【沈七】

    C/C++实现蛇形矩阵(超详解) 题目链接 题目描述 输入样例 题解部分 完整代码 完结散花 悄悄告诉你: 参考文章 萌新报道! 唤我沈七就行嘿嘿. 大一软件工程在读. 菜鸡蒟蒻想在博客中记录一些算法 ...

  6. ModelMatrix、ModelViewMatrix、ProjectionMatrix、NormalMatrix模型矩阵、模型视图矩阵、投影矩阵、正规矩阵详解

    ModelMatrix.ModelViewMatrix.ProjectionMatrix.ModelMatrix模型矩阵.模型视图矩阵.投影矩阵.正规矩阵详解 1. 前言 在openGL经常用到Mod ...

  7. 详解模板注入漏洞(下)

    作者 | 原作者gosecure,翻译整理shan66 来源 | http://gosecure.github.io/ 在上一篇文章中,我们为读者详细介绍了模版注入漏洞的概念,模版引擎的识别方法,以及 ...

  8. 详解模板引擎工作机制

    本文讲的是详解模板引擎工作机制, 我已经使用各种模版引擎很久了,现在终于有时间研究一下模版引擎到底是如何工作的了. 简介 简单的说,模版引擎是一种可以用来完成涉及大量文本数据的编程任务的工具.一般而言 ...

  9. python【数据结构与算法】快速幂and矩阵快速幂取模(看不懂你来打我)

    文章目录 1 解释快速幂 2 代码(这里就不考虑指数为小于0的情况了) 3 下面是矩阵快速幂,区别只是底数换成了矩阵 1 解释快速幂 传统的幂运算,是对底数进行连乘,时间复杂度为o(n),例如:2^1 ...

最新文章

  1. 一个关于wwf和linq的部署问题?
  2. 彻底理解android中的内部存储与外部存储
  3. python采集_Python采集实例2
  4. seo 伪原创_seo伪原创工具(解析新云查新型伪原创模式工具)
  5. IEEE正推进制定量子计算标准
  6. Python 面向对象高级编程——定制类
  7. jquery radio设置选中_前端jQuery实战之 attr() 和 prop() 的区别
  8. Oracle基础--PL/SQL编程基本语法
  9. 电脑感叹号,电脑网络出现感叹号怎么解决?Win7系统网络出现感叹号的解决方法...
  10. 阿里云道哥:我曾经是饱受网络攻击摧残的创业者,现在我要帮他们顶住
  11. 价值几千行代码的一键安装开源啦,欢迎各位领导莅临指导(贡献代码)
  12. html下拉菜单图片,JS+CSS 制作的超级简单的下拉菜单附图
  13. 使用antd-pro组件 实现图片上传和图片编辑
  14. 【如何在自己的宿舍有一台幽灵主机?】关于如何合理配置外网透穿和进行System服务的编写、安装,同时添加局域网唤醒等的一次实践。
  15. 什么是内联电子商务_什么是电子商务
  16. SREcon大会预告 | 百度运维专家对智能故障诊断的思考
  17. 66.android 导入项目报错Error:Execution failed for task ':app:validateDebugSigning'. Keystore file F:\myA
  18. 使用easypoi将数据导入excel中
  19. unicode RLO 伪装windows文件格式
  20. seata xid是什么_html中的xid

热门文章

  1. WAVENET论文阅读
  2. 杭州互联网人的冬天 |程序员有话说
  3. 静态HTML网页设计作品——服装商城-功能齐全(31页) HTML+CSS+JavaScript 学生DW网页设计作业成品 web课程设计网页规划与设计 计算机毕设网页设计源码
  4. 网络营销向左,SEO向右
  5. 为什么芯片上的晶体管越做越小?
  6. js实现登录注册功能
  7. 【Java】【阿里云大学】面向对象编程全套笔记(更新中)
  8. 介绍WS Federaion 二:把百度和谷歌和谐起来
  9. Microsoft SQL server 2008 R2图文+视频安装教程
  10. 数据库视频sql server概述