博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
矩阵快速幂优化线性递推
阅读量:4544 次
发布时间:2019-06-08

本文共 1759 字,大约阅读时间需要 5 分钟。

我们熟知的斐波那契数列递推公式是:

\(f(n)=f(n-1)+f(n-2)\)

假设我们需要求斐波那契数列的第n项,当n非常大(如n=1e9)的时候,递推肯定超时。我们不妨设:

\(\binom{f_{n}}{f_{n-1}}=\begin{pmatrix}a & b\\ c & d\end{pmatrix}\binom{f_{n-1}}{f_{n-2}}\)

将等式右边乘开,得到: 

\(\binom{af_{n-1}+bf_{n-2}}{cf_{n-1}+df_{n-2}}\)

要使其等于等式左边,显然:

\(\binom{f_{n}}{f_{n-1}}=\begin{pmatrix}1 & 1\\ 1 & 0\end{pmatrix}\binom{f_{n-1}}{f_{n-2}}\)

如此递推下去,我们最终能够得到:

\(\binom{f_{n}}{f_{n-1}}=\begin{pmatrix}1 & 1\\ 1 & 0\end{pmatrix}^{n-2}\binom{f_{2}}{f_{1}}\)

我们已知\(f1=1,f2=1\),这样,我们就可以通过矩阵快速幂来求数列第n项了! 像这样,对于所有的线性递推关系,我们都可以使用矩阵快速幂来优化ovo

模版如下(洛谷P3390 矩阵快速幂):

#include 
#include
#include
#define mod 1000000007#define ll long longusing namespace std;struct Matrix{ ll m[101][101];}a,e;ll n,k;Matrix mul(Matrix x,Matrix y){ Matrix c; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { c.m[i][j]=0; } } 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]%mod+x.m[i][k]*y.m[k][j]%mod; } } } return c;}Matrix mqpow(Matrix x,ll p){ Matrix ans=e; while(p!=0) { if(p%2) { ans=mul(ans,x); } x=mul(x,x); p/=2; } return ans;}int main(){ scanf("%lld%lld",&n,&k); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { scanf("%lld",&a.m[i][j]); } } for(int i=1;i<=n;i++) { e.m[i][i]=1; }//初始化 Matrix ans=mqpow(a,k); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { printf("%lld ",ans.m[i][j]%mod); } printf("\n"); } return 0;}

 

转载于:https://www.cnblogs.com/Bw-Orzzzzz/p/10829115.html

你可能感兴趣的文章
用 Canvas 制作刮刮卡
查看>>
挂载光盘与rpm安装
查看>>
[Android学习系列18]线程,进程,异步的一些事
查看>>
腾讯 AI Lab 计算机视觉中心人脸 & OCR团队近期成果介绍(3)
查看>>
课堂练习-增加信息
查看>>
A little issue in Mathematical Thought from Ancient to Modern Times, Vol. 3
查看>>
Zabbix对接AD域
查看>>
django 将view视图中的对象传入forms表单验证模块中
查看>>
log4net配置
查看>>
中文词频统计及词云制作
查看>>
python面试题No5
查看>>
BeanShell PreProcessor数据base64加密
查看>>
10条建议帮助你创建更好的jQuery插件
查看>>
setPreferredSize和setSize的区别及用法
查看>>
Python简介及编码
查看>>
[转]Android:Layout_weight的深刻理解
查看>>
监听键盘弹出 隐藏
查看>>
iOS开发 - NSBundle, NSDevice, NSLocale
查看>>
innerHtml安全问题
查看>>
UVA 11992,。。。伪-二维线段树
查看>>