教主传授

快速幂的思想:

假设我们要求a^b,最朴素的方法就是不断地乘a,乘b次,复杂度O(b)。
如果b很大,10^9,就需要用快速幂的思想。
例:a=3,b=100;
100的二进制为:1100100
也就是100可以化成64+32+4。
所以原数可以化成a^64*a^32*a^4

算法流程:
判断1100100的每一位是否为1,如果是1,就乘对应的二进制次幂。以此类推,直到乘完全部的位数。
时间复杂度O(log n)

代码:

int quickpow(int a,int b){ans=1; while(b){if(b&1) ans*=a;a*=a;b>>=1;}return ans;
}

矩阵与DP
a[i]=a[i-1]+b[i-1]+1,b[i]=2*a[i-1]-5 ;a[1]=1,b[1]=1,问a[x]=?,b[x]=?
很简单的递推,一步步推即可,但是,如果x是10^9,如何推?
思维:递推式可以化为矩阵乘积

那么,矩阵A[i]=A[i-1]*B;
A[i+1]=A[i]*B=A[i-1]*B*B
A[x]=A[1]*B*B*B.......=A[1]*( B^(x-1) );
因为矩阵乘积可以换乘积顺序,所以可以先算出B^(x-1),如何计算呢?
快速幂!

问题迎刃而解~

1.构造出递推矩阵
2.对构造出的矩阵B,进行B^x的快速幂,乘积换成矩阵乘法。
3.最后矩阵的第一行第一列和第二列就是a[x]和a[y]。

其实快速幂和矩阵快速幂是异曲同工,但是往往构造矩阵是难点,转载一个别人博客写的矩阵构造方法:

Fibonacci数列:F(0)=1 , F(1)=1 , F(n)=F(n-1)+F(n-2)

我们以前快速求Fibonacci数列第n项的方法是 构造常系数矩阵

(一) Fibonacci数列f[n]=f[n-1]+f[n-2],f[1]=f[2]=1的第n项快速求法(不考虑高精度)

解法:

考虑1×2的矩阵【f[n-2],f[n-1]】。根据Fibonacci数列的递推关系,我们可以通过乘以一个2×2的矩阵A,得到矩阵:【f[n-1],f[n]】。

即:【f[n-2],f[n-1]】*A = 【f[n-1],f[n]】=【f[n-1],f[n-1]+f[n-2]】

很容易构造出这个2×2矩阵A,即:
0 1
1 1

所以,有【f[1],f[2]】×A=【f[2],f[3]】
又因为矩阵乘法满足结合律,故有:
【f[1],f[2]】×A ^(n-1) =【f[n],f[n+1]】
这个矩阵的第一个元素f[n]即为所求。



(二) 数列f[n]=f[n-1]+f[n-2]+1,f[1]=f[2]=1的第n项的快速求法(不考虑高精度)

解法:
仿照前例,考虑1×3的矩阵【f[n-2],f[n-1],1】,希望求得某3×3的矩阵A,使得此1×3的矩阵乘以A得到矩阵:【f[n-1],f[n],1】

即:【f[n-2],f[n-1],1】* A =【f[n-1],f[n],1】=【f[n-1],f[n-1]+f[n-2]+1,1】

容易构造出这个3×3的矩阵A,即:
0 1 0
1 1 0
0 1 1

故:【f[1],f[2],1】* A^(n-1) = 【f[n],f[n+1],1】



(三)数列f[n]=f[n-1]+f[n-2]+n+1,f[1]=f[2]=1的第n项的快速求法(不考虑高精度).
解法:

仿照前例,考虑1×4的矩阵【f[n-2],f[n-1],n,1】,希望求得某4×4的矩阵A,使得此1×4的矩阵乘以A得到矩阵:【f[n-1],f[n],n+1,1】
即:【f[n-2],f[n-1],n,1】* A = 【f[n-1],f[n],n+1,1】=【f[n-1],f[n-1]+f[n-2]+n+1,n+1,1】
容易构造出这个4×4的矩阵A,即:

0 1 0 0
1 1 0 0
0 1 1 0
0 1 1 1

故:【f[1],f[2],3,1】* A^(n-1) = 【f[n],f[n+1],n+2,1】



(四) 数列f[n]=f[n-1]+f[n-2],f[1]=f[2]=1的前n项和s[n]=f[1]+f[2]+……+f[n]的快速求法(不考虑高精度).
解法:

仿照之前的思路,考虑1×3的矩阵【f[n-2],f[n-1],s[n-2]】,我们希望通过乘以一个3×3的矩阵A,得到1×3的矩阵:【f[n-1],f[n],s[n-1]】
即:【f[n-2],f[n-1],s[n-2]】 * A = 【f[n-1],f[n],s[n-1]】=【f[n-1],f[n-1]+f[n-2],s[n-2]+f[n-1]】
容易得到这个3×3的矩阵A是:

0 1 0
1 1 1
0 0 1

这种方法的矩阵规模是(r+1)*(r+1)

f(1)=f(2)=s(1)=1 ,所以,有

【f(1),f(2),s(1)】* A = 【f(2),f(3),s(2)】

故:【f(1),f(2),s(1)】* A^(n-1) = 【f(n),f(n+1),s(n)】



(五) 数列f[n]=f[n-1]+f[n-2]+n+1,f[1]=f[2]=1的前n项和s[n]=f[1]+f[2]+……+f[n]的快速求法(不考虑高精度).
解法:

考虑1×5的矩阵【f[n-2],f[n-1],s[n-2],n,1】,
我们需要找到一个5×5的矩阵A,使得它乘以A得到如下1×5的矩阵【f[n-1],f[n],s[n-1],n+1,1】
即:【f[n-2],f[n-1],s[n-2],n,1】* A =【f[n-1],f[n],s[n-1],n+1,1】
=【f[n-1], f[n-1]+f[n-2]+n+1,s[n-2]+f[n-1],n+1,1】

容易构造出A为:
0 1 0 0 0
1 1 1 0 0
0 0 1 0 0
0 1 0 1 0
0 1 0 1 1

故:【f(1),f(2),s(1),3,1】* A^(n-1) = 【f(n),f(n+1),s(n),n+2,1】



一般地,如果有f[n]=p*f[n-1]+q*f[n-2]+r*n+s
可以构造矩阵A为:
0 q 0 0 0
1 p 1 0 0
0 0 1 0 0
0 r 0 1 0
0 s 0 1 1


传送门——>快速幂基本思想



如果这篇文章对你产生了帮助,就请给博主一个小小的赞吧!大家的点赞是我创作的最大动力!

矩阵快速幂(教主传授)相关推荐

  1. 43行代码AC_HDU-2604 Queuing(矩阵快速幂,附详细的知识讲解、模板例题)

    一道经典的矩阵快速幂模板题. 传送门1-->快速幂基本思想 传送门2-->矩阵快速幂讲解(教主传授) 传送门3.1-->HDU-1575(经典矩阵快速幂模板题1) 传送门3.2--& ...

  2. 43行代码AC——HDU 1757 A Simple Math Problem(矩阵快速幂,附快速幂讲解)

    一道经典的矩阵快速幂模板题. 传送门1-->快速幂基本思想 传送门2-->矩阵快速幂讲解(教主传授) 代码(去掉空行43行) #include<iostream> #inclu ...

  3. 40行代码AC_HDU 1575 TrA 矩阵快速幂(附快速幂+矩阵快速幂的讲解)

    一道经典的矩阵快速幂模板题. 传送门1-->快速幂基本思想 传送门2-->矩阵快速幂讲解(教主传授) 心路历程 1.开始看成求主对角线元素和的n次幂了,用快速幂解得.结果压根不对,又仔细看 ...

  4. 矩阵快速幂+构造方法

    与快速幂一样,可以将递推式通过二进制的方式来进行优化,这个学了快速幂就是十分容易理解 大概的板子如下: struct mat///自己定义大小的矩阵 {ll m[11][11]; }; mat mul ...

  5. 【做题】SRM701 Div1 Hard - FibonacciStringSum——数学和式&矩阵快速幂

    原文链接 https://www.cnblogs.com/cly-none/p/SRM701Div1C.html 题意:定义"Fibonacci string"为没有连续1的01串 ...

  6. 快速幂 + 矩阵快速幂

    快速幂 1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #define LL lo ...

  7. HDU4549(矩阵快速幂+快速幂)

    f(n)=a^f(n-1) + b^f(n-2):计算矩阵部分用矩阵快速幂:计算a的幂次和b的幂次用快速幂. #include<iostream> #include<algorith ...

  8. [HNOI2008]GT考试[矩阵快速幂+kmp优化的dp]

    解题思路:假如说我们用f[i]表示长度为i的串能组合成无不吉利数字的组合的个数的话我们无法找到f[i]和f[i+1]的关系,就是我们下一位填某个数字会不会出现不吉利串,这就和你前面的串末尾于不吉利串重 ...

  9. I-Matrix Power Series POJ - 3233 矩阵快速幂+分治

    I-Matrix Power Series POJ - 3233 矩阵快速幂+分治 Problem Description Given a n × n matrix A and a positive ...

最新文章

  1. Ubuntu16.04 Table无法自动补全
  2. 2019 年,19 种方法让自己成为更好的 Node.js 工程师
  3. 12核心 联发科和台积电将研发7nm芯片
  4. SpringBoot中yml文件报错:org.yaml.snakeyaml.scanner.ScannerException:mapping values are not allowe here...
  5. 中立安全·赋能产业,神策数据受邀出席 UCloud 用户大会
  6. 走向.NET架构设计—第四章—业务层分层架构(前篇)
  7. apache kafka_Apache Kafka简介
  8. python网站框架下载_web.py首页、文档和下载 - Python框架 - OSCHINA - 中文开源技术交流社区...
  9. .NET中删除确认框的实现
  10. 微软4月补丁星期二修复119个漏洞,含2个0day
  11. objective-C语言:第一个OC程序
  12. 选择排序之python实现
  13. 《Web漏洞防护》读书笔记——第5章,数据安全
  14. 盘点:2012中国互联网大会十大亮点
  15. arduino入门(一)arduino下载安装,炒鸡详解
  16. idea编译android项目,IDEA创建Android项目并反编译APK
  17. 问:全局变量是否可以定义在被多个.c文件包含的头文件.h中?
  18. 讲解图层样式中的混合颜色带
  19. 一张“黑洞”照片需半吨重硬盘?更逆天的操作还有这些……
  20. 手把手带你搭建一个简单的webpack脚手架(一)

热门文章

  1. HashedWheelTimer时间轮原理分析
  2. Linux调度系统全景指南(终结篇)
  3. LiveVideoStackCon 2022 上海站延期通告(内附最新日程海报)
  4. 音视频领域或将开启”外卷“之路
  5. 微信基于时间序的海量存储扩展性与多机容灾能力提升
  6. TSRC白帽子,10亿用户的守护者
  7. nginx: [emerg] bind() to 0.0.0.0:443 failed (98: Address already in use)
  8. 时光机穿梭---管理修改
  9. kotlin spring-webflux netty
  10. Request method 'GET' not supported解决方式