洛谷P1962 斐波那契数列
2017-10-25 15:12
274 查看
题目背景
大家都知道,斐波那契数列是满足如下性质的一个数列:• 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
说明
对于 60% 的数据: n ≤ 92对于 100% 的数据: n在long long(INT64)范围内。
裸的矩阵快速幂
需要特判0,1两种情况
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #define LL long long using namespace std; const int MAXN=200000001; const int mod=1000000007; inline LL read() { char c=getchar();LL flag=1,x=0; while(c<'0'||c>'9') {if(c=='-') flag=-1;c=getchar();} while(c>='0'&&c<='9') x=x*10+c-48,c=getchar(); return x*flag; } LL n; struct Matrix { LL a[5][5]; Matrix() { memset(a,0,sizeof(a)); } }; Matrix Matrix_Mul(Matrix a,Matrix b) { Matrix c; for(LL k=1;k<=2;k++) for(LL i=1;i<=2;i++) for(LL j=1;j<=2;j++) c.a[i][j]+=(a.a[i][k]*b.a[k][j])%mod; return c; } inline void WORK() { Matrix bg,tmp; bg.a[1][1]=1;bg.a[1][2]=1; tmp.a[1][1]=0;tmp.a[1][2]=1; tmp.a[2][1]=1;tmp.a[2][2]=1; while(n) { if(n&1) bg=Matrix_Mul(bg,tmp); tmp=Matrix_Mul(tmp,tmp); n>>=1; } printf("%lld",bg.a[1][2]%mod); } int main() { n=read();n=n-2; if(n==-1||n==-2) { printf("1"); return 0; } WORK(); return 0; }
相关文章推荐
- 洛谷—— P1962 斐波那契数列
- 洛谷_P1962_斐波那契数列
- 洛谷 P1962 斐波那契数列
- 洛谷P1962 斐波那契数列 || P1349 广义斐波那契数列[矩阵乘法]
- 洛谷P1962 斐波那契数列【矩阵运算】
- AC日记——斐波那契数列 洛谷 P1962
- 【洛谷P1962 斐波那契数列】矩阵快速幂+数学推导
- P2626 斐波那契数列(升级版) 洛谷(2626)
- 【洛谷1962】 斐波那契数列
- 【洛谷1962】 斐波那契数列
- P1962 斐波那契数列
- [洛谷1962]斐波那契数列
- 洛谷 P2626 斐波那契数列(升级版)
- 洛谷P1962 斐波那契数列
- 洛谷11月月赛 T3 斐波那契数列
- [LUOGU] P1962 斐波那契数列
- [P1962]斐波那契数列
- 矩阵——P1962 斐波那契数列
- P1962 斐波那契数列
- 洛谷 P2626 斐波那契数列(升级版)