矩阵,一个神奇又令人崩溃的东西,常常用来优化序列递推

在百度百科中,矩阵的定义:

在数学中,矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合 ,最早来自于方程组的系数及常数所构成的方阵。这一概念由19世纪英国数学家凯利首先提出。

好,很高深对吧。那我们就更加直接地理解一下矩阵的实质:二维数组

好了这个SB都会,就不解释了

同二维数组一样,矩阵是一个'纵横排列的二维数据表格',它一般是一个n*m的二维数组,其中n*m表示它有n行m列

每一位上的数可以用下标i,j来表示,形如这样一个矩阵:

这里我们就可以用B[1][2]来表示8这个元素

矩阵有加/减/乘法(有没有除法我不知道),其中加减法的限制比较大,当且仅当两个矩阵的行列数都相等时才能进行加减

加减的操作也很简单,只需要按位加减即可

这些都是次要的,最主要的其实是矩阵乘法

我们定义矩阵乘法:设A为m*p的矩阵,B为p*n的矩阵,那么称m*n的矩阵C为矩阵A与B的乘积,记作C=AB,其中矩阵C中的第i行第j列元素可以表示为:

这样我们就很轻松的得到了一个O(n^3)的矩阵乘法,虽然还有更快的,但一般来说已经足够

矩阵乘法有以下几条重要性质:

  1. 矩阵乘法满足集合律,即(AB)C=A(BC)

  2. 矩阵乘法满足分配律,即(A+B)C=AC+BC

  3. 矩阵乘法一般不满足交换律

以上第三条就告诉我们,平时写两个数相乘的时候可以为所欲为,但是矩阵就完全不同了,AB!=BA

很简单,结合矩阵乘法来理解下。

换句更简单的,甚至交换后这两个矩阵都无法相乘,因为他们的列数可能就不相等了

然后我们又由于第一条可以得出矩阵快速幂的算法

首先矩阵幂只有方阵(即行数等于列数的矩阵)才可以做,要不然到后面都乘不了了(还是因为列数不相等了)

这个也很简单,我们只需要把一般的快速幂乘法部分改成矩阵乘法即可

还是一句话:不要乘反了!

对了,还要引出一个叫单位矩阵的东西,这个就好比一般乘法中的单位1一样。任何一个矩阵乘上单位矩阵都得到原来这个矩阵

单位矩阵为:

就是一个矩阵对角线上都是1

自己动手推一下就可以更深刻地理解一下了

然后我们就引出我们讨论的问题:斐波那契数列的矩阵优化

例题:Luogu P1962 斐波那契数列,求斐波那契数列的第n项%一个数的值

我们可以利用矩阵在线性代数和方程的作用在解决这个问题

我们考虑一个矩阵:

然后我们用一个列向量(就是列数为1的矩阵)来表示一下当前状态下斐波那契数列的值,由于斐波那契数列只要用到前两项,因此我们可以设:

然后我们让这两个矩阵相乘,得到新的矩阵:

上面的这一项不就是斐波那契的递推式了吗?而且下面的这一项刚好可以为下一次做准备

因此我们只需要把原来的[1,1]列向量乘斐波那契的递推矩阵(n-2)次即可(注意前面的两项就是初始值)

但是如果就是这样的话就太慢了,因此我们又联想到矩阵乘法的结合律

即直接先求出斐波那契矩阵的(n-2)次,然后再与[1,1]的列向量相乘即可

再简化后就是斐波那契矩阵的(n-2)次的[1][1]与[1][2]上值的和

这样就完成了矩阵的第一步也是最简单,最基础的一步

注意矩阵一般的写法还是写成结构体比较好

由于这里的矩阵大小都是确定的,就没有在矩阵中记录行列数了,一般情况下都是以记录为主

好了接下来给出CODE

  1. #include<cstdio>
  2. using namespace std;
  3. typedef long long LL;
  4. const LL N=3,mod=1000000007;
  5. LL F[N],ans[N];
  6. struct Matrix
  7. {
  8. LL a[N][N];
  9. inline void init(void)
  10. {
  11. a[1][1]=a[2][2]=1;
  12. a[1][2]=a[2][1]=0;
  13. }
  14. inline void Fb_init(void)
  15. {
  16. a[1][1]=a[1][2]=a[2][1]=1;
  17. a[2][2]=0;
  18. }
  19. };
  20. inline Matrix mul(Matrix A,Matrix B)
  21. {
  22. register int i,j,k;
  23. Matrix C;
  24. for (i=1;i<N;++i)
  25. for (j=1;j<N;++j)
  26. for (C.a[i][j]=0,k=1;k<N;++k)
  27. C.a[i][j]=(C.a[i][j]+A.a[i][k]*B.a[k][j])%mod;
  28. return C;
  29. }
  30. inline Matrix quick_pow(Matrix A,LL p)
  31. {
  32. Matrix B; B.init();
  33. while (p)
  34. {
  35. if (p%2) B=mul(B,A);
  36. A=mul(A,A); p/=2;
  37. }
  38. return B;
  39. }
  40. int main()
  41. {
  42. register int i,j;
  43. LL n; scanf("%lld",&n);
  44. if (n<=2) { puts("1"); return 0; }
  45. n-=2; F[1]=F[2]=1;
  46. Matrix A; A.Fb_init();
  47. A=quick_pow(A,n);
  48. printf("%lld",(A.a[1][1]+A.a[1][2])%mod);
  49. return 0;
  50. }

(以上的一部分图片来自百度百科,一部分来自于Luogu憧憬未来 dalao)的题解

矩阵乘法&&矩阵快速幂&&最基本的矩阵模型——斐波那契数列的更多相关文章

  1. 【矩阵乘法】【快速幂】【递推】斐波那契数列&&矩乘优化递推模板

    题目大意: F[0]=0 F[1]=1 F[n+2]=F[n+1]+F[n] 求F[n] mod 104. F[n+2] F[n+1] = 1 1 1 0 * F[n+1] F[n] 记这个矩阵为A, ...

  2. Lua习题练习(9*9乘法表,输出所指定的图像,斐波那契数列)

    1. (循环语句的嵌套使用)有 1,2,3,4四个数字,能组成多少个互不相同且无重复数字的 三位数,并输出在屏幕上面2. 计算斐波那携数列的前20个数字,并输出在屏幕上面 .指的是这样一个数列(1,1 ...

  3. Luogu 3390 【模板】矩阵快速幂 (矩阵乘法,快速幂)

    Luogu 3390 [模板]矩阵快速幂 (矩阵乘法,快速幂) Description 给定n*n的矩阵A,求A^k Input 第一行,n,k 第2至n+1行,每行n个数,第i+1行第j个数表示矩阵 ...

  4. Luogu 1349 广义斐波那契数列(递推,矩阵,快速幂)

    Luogu 1349 广义斐波那契数列(递推,矩阵,快速幂) Description 广义的斐波那契数列是指形如\[A_n=p*a_{n-1}+q*a_{n-2}\]的数列.今给定数列的两系数p和q, ...

  5. Luogu 1962 斐波那契数列(矩阵,递推)

    Luogu 1962 斐波那契数列(矩阵,递推) Description 大家都知道,斐波那契数列是满足如下性质的一个数列: f(1) = 1 f(2) = 1 f(n) = f(n-1) + f(n ...

  6. Luogu T7152 细胞(递推,矩阵乘法,快速幂)

    Luogu T7152 细胞(递推,矩阵乘法,快速幂) Description 小 X 在上完生物课后对细胞的分裂产生了浓厚的兴趣.于是他决定做实验并 观察细胞分裂的规律. 他选取了一种特别的细胞,每 ...

  7. [codevs]1250斐波那契数列<矩阵乘法&快速幂>

    题目描述 Description 定义:f0=f1=1, fn=fn-1+fn-2(n>=2).{fi}称为Fibonacci数列. 输入n,求fn mod q.其中1<=q<=30 ...

  8. 矩阵乘法快速幂 codevs 1574 广义斐波那契数列

    codevs 1574 广义斐波那契数列  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond   题目描述 Description 广义的斐波那契数列是指形如 ...

  9. [luogu P1962] 斐波那契数列(带快速幂矩阵乘法模板)

    题目背景 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数) 题目描述 请 ...

随机推荐

  1. [iOS] 输入框高度随输入内容变化

    一般,类似聊天软件的输入框默认都是显示一行的,在用户输入过程中根据输入文字的内容来改变输入框的高度,以便显示全部文字.像微信,QQ的输入框就是这样的.那么这个效果应该怎么实现呢? 新博客:wosson ...

  2. json_encode无返回结果

    今天写php curl模拟客户端访问测试一个抽奖post数据,拿回来的数据是json,使用json_decode函数就是没结果,百度谷歌好久.终于发现是BOM的文件头造成的, 微软为utf-8文件添加 ...

  3. datetime24小时格式和12小时格式

    12:DateTime.Now.ToString("hh:mm:ss") 24:DateTime.Now.ToString("HH:mm:ss")

  4. 《SQL Server 2008从入门到精通》--20180724

    目录 1.事务 1.1.事务的ACID属性 1.2.事务分类 1.2.1.系统提供的事务 1.2.2.用户自定义的事务 1.3.管理事务 1.3.1.SAVE TRANSACTION 1.3.2.@@ ...

  5. 【转】Java学习---内存溢出的排查经历

    [原文]https://www.toutiao.com/i6595365358301872643/ 前言 OutOfMemoryError 问题相信很多朋友都遇到过,相对于常见的业务异常(数组越界.空 ...

  6. 乘风破浪:LeetCode真题_027_Remove Element

    乘风破浪:LeetCode真题_027_Remove Element 一.前言 这次是从数组中找到一个元素,然后移除该元素的所有结果,并且返回长度. 二.Remove Element 2.1 问题 2 ...

  7. VS 0x80041FEB

    在打开from设计界面时,报错. 解决方法:将项目中Properties文件中licenses.licx删除,重新建立一个空的licenses.licx文件放到项目中. 重新打开界面,解决

  8. Alpha冲刺报告(11/12)(麻瓜制造者)

    今日已完成 邓弘立: 整合了主页的功能 符天愉: 大致上完成了留言部分的添加,删除,查询功能 江郑: 测试了剩余四个查询,一个添加接口,也搞定了接口说明. 刘双玉: 测试了剩余四个查询,一个添加接口, ...

  9. Spring IOC 之 SmartInitializingSingleton

    使用 实现该接口后,当所有单例 bean 都初始化完成以后, 容器会回调该接口的方法 afterSingletonsInstantiated. 主要应用场合就是在所有单例 bean 创建完成之后,可以 ...

  10. [CTSC2018]混合果汁

    题目连接:https://www.luogu.org/problemnew/show/P4602 因为题中说是让最小值最大,所以自然想到二分答案.对于每一个二分的值,判断是否合法,若合法,在右区间二分 ...