题目背景
大家都知道,斐波那契数列是满足如下性质的一个数列:
• 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)范围内。
代码
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long long ll; const ll mod=1e9+7; ll n; struct mat { ll m[6][6]; }x,y; inline mat matmul(mat a,mat b,int len){ mat res; for(int i=1;i<=2;++i) for(int j=1;j<=len;++j){ res.m[i][j]=0; for(int k=1;k<=2;++k) res.m[i][j]=(res.m[i][j]+a.m[i][k]*b.m[k][j])%mod; } return res; } mat matpow(mat a,ll p){ mat res; for(int i=1;i<=2;++i) for(int j=1;j<=2;++j) for(int k=1;k<=2;++k) res.m[i][j]=a.m[i][j]; for(ll i=p-1;i;i>>=1,a=matmul(a,a,2)) if(i&1) res=matmul(res,a,2); return res; } int main() { scanf("%lld",&n); if(n<=2){printf("%d ",1); return 0;} x.m[1][1]=x.m[1][2]=x.m[2][1]=1; y.m[1][1]=y.m[2][1]=1; x=matpow(x,n-2); y=matmul(x,y,2); printf("%lld ",y.m[1][1]); return 0; }