洛谷——P1962 斐波那契数列(矩阵快速幂)
2019-05-23 14:31
78 查看
题目背景
大家都知道,斐波那契数列是满足如下性质的一个数列:
• f(1) = 1
• f(2) = 1
• f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数)
题目描述
请你求出 f(n) mod 1000000007 的值。
输入输出格式
输入格式:
·第 1 行:一个整数 n
输出格式:
第 1 行: f(n) mod 1000000007 的值
输入1
5
输出1
5
输入2
10
输出2
55
*简析 *开始以为是水题,结果敲完直接两发TLE教做人,后面就去各位大佬博客学习了一下这个矩阵快速幂,具体的做法代码里面全有注释,本弱鸡就不罗嗦了orz
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int mod=1000000007; typedef vector<ll> vec;//不定一维数组 typedef vector<vec> mat;//不定二维数组 mat mul(mat &a,mat &b)//表示vector真的不熟悉,大概看的懂就行了吧 { mat c(a.size(),vec(b[0].size())); //矩阵相乘a*b 的矩阵与b*c的矩阵相乘得到a*c的矩阵 for(int i=0; i<2; i++) { for(int j=0; j<2; j++) { for(int k=0; k<2; k++) { c[i][j]+=a[i][k]*b[k][j]; c[i][j]%=mod; } } } return c; } mat pow(mat a,ll n) //快速幂 { mat res(a.size(),vec(a.size())); for(int i=0; i<a.size(); i++) res[i][i]=1;//单位矩阵; while(n) { if(n&1) res=mul(res,a); a=mul(a,a); n/=2; } return res; } ll solve(ll n) { mat a(2,vec(2)); a[0][0]=1; a[0][1]=1; a[1][0]=1; a[1][1]=0; a=pow(a,n); return a[0][1];//也可以是a[1][0]; } int main() { ll n; while(cin>>n&&n!=-1) { cout<<solve(n)<<endl; } return 0; }
相关文章推荐
- 【洛谷P1962 斐波那契数列】矩阵快速幂+数学推导
- 洛谷P1962 斐波那契数列【矩阵运算】
- 洛谷P1962 斐波那契数列 || P1349 广义斐波那契数列[矩阵乘法]
- hdoj 5895 Mathematician QSC 【数论----矩阵快速幂求解类斐波那契数列】
- HDOJ 4549 M斐波那契数列 矩阵快速幂+欧拉降幂公式
- HDU 4549 M斐波那契数列(矩阵快速幂+快速幂+欧拉降幂)
- 51 nod 1242 斐波那契数列的第N项 矩阵快速幂
- nod51-1242斐波那契数列-矩阵快速幂
- HDU4549M-斐波那契数列(矩阵快速幂,二分幂)
- NYOJ301递推求值 NYOJ 1000又见斐波那契数列(矩阵快速幂)
- hdoj 4549 M斐波那契数列 【矩阵快速幂 + 费马小定理 + 快速幂】
- hdu 4549 M斐波那契数列(矩阵快速幂,快速幂降幂)
- HDU 4549M斐波那契数列(矩阵快速幂+费马小定理)
- 洛谷 P1939 【模板】矩阵加速(数列):优化递推式的方法——矩阵快速幂
- 斐波那契数列 (矩阵快速幂)
- 洛谷 3390 矩阵快速幂
- HDU 4549 M斐波那契数列(矩阵快速幂+费马小定理)
- HDOJ M斐波那契数列 4549【矩阵快速幂+快速幂+费马小定理+欧拉函数】
- hdu4549 M斐波那契数列(矩阵快速幂)
- 矩阵快速幂模板及其应用(洛谷3390)(洛谷1962)