洛谷 P1962 斐波那契数列
题目背景
大家都知道,斐波那契数列是满足如下性质的一个数列:
• 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> #define LL long long #define mod 1000000007LL using namespace std; LL n; struct matrix{ LL t[120][120]; matrix(){memset(t,0,sizeof(t));} }; matrix mul(matrix a,matrix b){ matrix res; for(int i=1;i<=2;i++){ for(int j=1;j<=2;j++){ for(int k=1;k<=2;k++){ res.t[i][j]=(res.t[i][j]%mod+a.t[i][k]*b.t[k][j]%mod)%mod; } } } return res; } matrix matrixksm(matrix a,LL k){ k--;matrix ret=a; while(k){ if(k&1)ret=mul(ret,a); a=mul(a,a); k>>=1; } return ret; } int main(){ scanf("%lld",&n);matrix ans,bas; if(n==0)printf("0\n"); else if(n<=2)printf("1\n"); else { bas.t[1][1]=bas.t[2][1]=1; ans.t[1][1]=ans.t[1][2]=ans.t[2][1]=1;ans.t[2][2]=0; ans=matrixksm(ans,n-1); ans=mul(ans,bas); cout<<ans.t[2][1]<<endl; } return 0; }