Luogu 1962 斐波那契数列(矩阵,递推)
2017-07-14 19:30
309 查看
Luogu 1962 斐波那契数列(矩阵,递推)
Description
大家都知道,斐波那契数列是满足如下性质的一个数列:f(1) = 1
f(2) = 1
f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数)
请你求出 f(n) mod 1000000007 的值。
Input
第 1 行:一个整数 nOutput
第 1 行: f(n) mod 1000000007 的值Sample Input
5Sample Output
5Http
Luogu:https://www.luogu.org/problem/show?pid=1962Source
递推,矩阵解决思路
普通的斐波那契数列大家都懂,用递推方程一个一个递推就可以了,但是本题的数据范围巨大,若是用递推的方法肯定会超时,那么我们在这里介绍一下矩阵的方法。关于矩阵的知识,请到我的这篇文章查看。
那么我们通过简单的推理可得矩阵递推方程:
\[F_i=F_{i-1}*T=\begin{bmatrix} f_{i-1} & f_{i-2} \\ 0& 0 \end{bmatrix}*\begin{bmatrix} 1 & 1 \\ 1 & 0\end{bmatrix}=\begin{bmatrix} f_i=f_{i-1}+f_{i-2} & f_{i-1} \\ 0 & 0 \end{bmatrix}\]
那么剩余的部分就是矩阵快速幂来完成了。
代码
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; #define ll long long//注意用长整形,因为有可能会爆int const int Mod=1000000007; const int inf=2147483647; class Matrix//定义矩阵 { public: ll M[2][2]; Matrix() { memset(M,0,sizeof(M)); } Matrix(int Arr[2][2])//定义两个方便的矩阵初始化 { for (int i=0;i<2;i++) for (int j=0;j<2;j++) M[i][j]=Arr[i][j]; } }; Matrix operator * (Matrix A,Matrix B)//重载乘号操作 { Matrix Ans; for (int i=0;i<2;i++) for (int j=0;j<2;j++) for (int k=0;k<2;k++) Ans.M[i][j]=(Ans.M[i][j]+A.M[i][k]*B.M[k][j]%Mod)%Mod; return Ans; } ll n; int main() { cin>>n; if (n<=2) { cout<<1<<endl; return 0; } n=n-2; int a[2][2]={{1,1},{0,0}};//初始矩阵 int b[2][2]={{1,1},{1,0}};//即上文的T Matrix A(a); Matrix B(b); while (n!=0)//快速幂 { if (n&1) A=A*B; B=B*B; n=n>>1; } cout<<A.M[0][0]<<endl; return 0; }
相关文章推荐
- Luogu 1349 广义斐波那契数列(递推,矩阵,快速幂)
- 矩阵加速递推(XDU 斐波那契数列为列)
- [luoguP1962] 斐波那契数列(矩阵快速幂)
- 浅谈斐波那契数列——从递推到矩阵乘法
- LuoguP1962 斐波那契数列 解题报告【矩阵快速幂】
- Luogu 1962(矩阵快速幂)
- hdu4549 M斐波那契数列 矩阵快速幂+快速幂
- UVA 10870 递推关系 矩阵快速幂
- 矩阵经典题目七:Warcraft III 守望者的烦恼(矩阵加速递推)
- HDOJ 题目4549 M斐波那契数列(数学,矩阵快速幂,费马小定理)
- nod51-1242斐波那契数列-矩阵快速幂
- [发布] 矩阵乘法及其对于编程求斐波那契数列的某一项的应用
- HDU 4549 M斐波那契数列【矩阵快速幂】
- [CQU 21466] zzblack与斐波那契数列 (矩阵快速幂)
- hdu3117(斐波那契数列,矩阵连乘)
- HDU 5015 233Matrix(矩阵快速幂+递推)
- 矩阵快速幂求斐波那契数列 poj3070
- POJ 2118 Firepersons 线性递推 矩阵快速幂
- EOJ 1499 矩阵快速幂求斐波那契数列
- hdu 2842 Chinese Rings(矩阵乘法+递推)