最经典的题目

以及洛谷一大堆相似题斐波那契升级版,广义斐波那契等等,都是相关的题目。一般而言我们求解斐波那契无非是不断地向前迭代,但是这样的效率实在是太低了。对于nnn的规模如此之大的题目应该如何求解呢?可能有人会认为通过递推式求出通项,就可以求解了。可是斐波那契数列的通项公式是

这谁能找出个规律来,由于式中包含无理数,无法简单求得模之后的结果。况且,在其他问题中有一些很难直接求得通项公式。不过这些情况都可以不求出通项,而用矩阵高效地求出第nnn项的值。

首先,我们先介绍一下对于斐波那契数列应该如何求解。把斐波那契数列的递推式表示成矩阵就得到了下面的式子

因此只要能求出AnA^nAn,就可以求出FnF_nFn​了。类似的,对于广义斐波那契数列而言,a1,a2a_1,a_2a1​,a2​以及递推关系式Fn=pFn−1+qFn−2F_n=pF_{n-1}+qF_{n-2}Fn​=pFn−1​+qFn−2​,系数p,qp,qp,q都是题目中给的,此时如何进行计算呢?只需要简单的修改矩阵AAA的样子就好了

就是新的矩阵AAA,原因如下图所示,
这样的话我们进行和正常斐波那契数列一样的递推,就能得出

计B=An−1B=A^{n-1}B=An−1也就是说Fn=B[1][0]∗F2+B[1][1]∗F1F_n=B[1][0]*F_2+B[1][1]*F_1Fn​=B[1][0]∗F2​+B[1][1]∗F1​,然后求个模就好了

#include<iostream>
#include<cmath>
#include<string.h>
#include<algorithm>
#include<vector>
#include<map>
#include<queue>
#include<iomanip>
using namespace std;#define ll long long
#define Max 1000
#define vec vector< ll >
#define arr vector< vec >ll p, q, a1, a2, n, m;arr mut(arr a, arr b) {arr c(2, vec(2));for (ll i = 0; i < 2; i++) {for (ll j = 0; j < 2; j++) {for (ll k = 0; k < 2; k++) c[i][j] = (c[i][j] + a[i][k] * b[k][j]) % m;}}return c;
}arr quick(arr a, ll n) {arr ans(2, vec(2)); ans[0][0] = 1; ans[1][1] = 1;//主对角线元素全1while (n > 0) {if (n & 1) ans = mut(ans, a);a = mut(a, a);n >>= 1;}return ans;
}int main() {cin >> p >> q >> a1 >> a2 >> n >> m;arr a(2, vec(2));//两行两列a[0][0] = p; a[0][1] = q; a[1][0] = 1; a[1][1] = 0;a = quick(a, n - 1);cout << (a[1][0] * a2%m + a[1][1] * a1%m) % m << endl;
}

更一般的

通过计算这个矩阵的nnn次幂,就可以在〇(m3log⁡n)〇(m^3 \log n)〇(m3logn) 的时间内计算出第nnn项的值。不过,如果递推式里含有常数项则稍微复杂一些,需变成如下形式

需要稍作分析的矩阵快速幂


矩阵幂求和


n∗nn*nn∗n的矩阵的kkk次幂可以通过快速幂在O(n3log⁡k)O(n^3\log k)O(n3logk)时间内求出。但是这又不是快速幂的模板题,怎么可能真的让你快速幂计算完一个一盒加起来,注意kkk的量级,O(n3k)O(n^3k)O(n3k)显然会超时。因此需要在挨个加的基础上进行一些改进,与上述问题不同的是,在这里我们还没有找到一个递推关系式,不妨把目光聚焦到SkS_kSk​与Sk−1S_{k-1}Sk−1​的关系上来,通过查看题解 仔细分析,我们得到了这个重要的关系

然后通过计算该矩阵的快速幂,我们就快速的进行了原式的求和。

矩阵快速幂详解--用矩阵幂解决的多种问题相关推荐

  1. 快速幂详解(通俗易懂!)

    本文为博主原创文章,未经允许不得转载.如有问题,欢迎指正! 快速幂详解 问题背景: 粗暴求解: 如何解决超时问题: 如何解决乘法溢出的问题: AC完整代码 总结: (一)一些说明 (二)特殊情况&am ...

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

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

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

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

  4. python符号格式化设置区间_Python 数值区间处理_对interval 库的快速入门详解

    使用 Python 进行数据处理的时候,常常会遇到判断一个数是否在一个区间内的操作.我们可以使用 if else 进行判断,但是,既然使用了 Python,那我们当然是想找一下有没有现成的轮子可以用. ...

  5. 数学--矩阵快速幂详解

    引导: 我们之前都学快速幂: 矩阵也是可以相乘,方阵可以自乘,即乘幂运算. 作用: 将线性递推,优化log2nlog_{2}nlog2​n 模板: 定义矩阵的阶 const int len = 15; ...

  6. (详解)矩阵快速幂详解与常见转移矩阵的构造

    目录 转移矩阵求解套路 常见转移矩阵1-斐波那契矩阵 承接套路 常见转移矩阵2-类斐波那契数列 常见转移矩阵3-幂常数 前缀和 具体DP问题 ----------------------------- ...

  7. 快速幂和矩阵快速幂详解+模板

    1.快速幂 一般的,我们都知道求只需要连续乘3次2就能得到,那么等于多少呢?其实这个一很简单,不就是13个2相乘吗,连续乘13次2就行了.那么,呢? 是不是要连续乘100次.1000次,我们将这类问题 ...

  8. 线性代数第二章矩阵及其运算详解

    一.线性方程组和矩阵 1.概念 如图所示,该矩阵称为m行n列矩阵 若行数和列数都等于n,则该矩阵称为n阶方阵 两个矩阵的行数相等,列数也相等,就称它们为同型矩阵 若A=(aij)和B=(bij)是同型 ...

  9. 【CG】针孔相机矩阵(Camera Matrix)详解

    0. 相机矩阵 Camera Matrix 小孔成像模型 成像过程 1. 相机矩阵的分解 齐次坐标下,物体的物理坐标是 [x,y,z,1]′ [ x , y , z , 1 ] ′ [x,y,z,1] ...

最新文章

  1. python画二维散点图-python3实现绘制二维点图
  2. Dockerfile基本结构
  3. python爬虫网络数据包_Python爬虫之多线程图虫网数据爬取(十六)
  4. Delphi DLL制作和加载 Static, Dynamic, Delayed 以及 Shared-Memory Manager
  5. PLSQL导出触发器代码
  6. python处理pdf文档_pyPdf - 用Python方便的处理PDF文档
  7. Asp.net(C#)年月日时分秒毫秒
  8. 『HarmonyOS』万物互联,分布式操作系统
  9. 全球公认最搞笑的15则冷笑话
  10. Python自动化填写问卷星问卷
  11. 循序渐进学Docker pdf
  12. Oracle EBS DBA培训提纲
  13. pg数据库数据量很小但是data目录很大的排查思路
  14. L1-7 天梯赛的善良 (20 分)
  15. tensorflow的early stopping模型保存方式
  16. 40%带宽成本节约!京东云视频云正式支持AV1编码
  17. 怎么开发联机小游戏_惊!!!个人游戏开发者的福音来了!
  18. 产品经理面试问题:上一家公司的离职原因
  19. 无参考图像质量评价NR-IQA
  20. Python多线程之守护进程

热门文章

  1. 棋盘代码_PHP实现国际象棋棋盘的样式效果(代码示例)
  2. 2021-06-21基于深度学习的智能机械故障诊断的部分域适应方法阅读笔记
  3. 数字图像处理_冈萨雷斯_一些重要的标准数组
  4. 写代码是人命关天的工作:盘点那些改变世界的代码 ,程序员惊了
  5. 企业分布式存储-EDS
  6. diff算法_深入剖析Vue源码 - 来,跟我一起实现diff算法!__Vue.js
  7. 【VBA(十一):使用VBA数组】【认识数组+数组应用案例+小结】
  8. 【C++项目实战】 门诊预约管理系统(底层UI封装)
  9. 红帽认证工程师及红帽认证技师应试指南
  10. [JetBrains注册] 利用教育邮箱注册JetBrains产品(pycharm、idea等)的方法