https://luogu.lohu.info/problem/show?pid=1962
题目背景
大家都知道,斐波那契数列是满足如下性质的一个数列:
• 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)范围内。
矩阵快速幂
问题转化为求
1 1 的 n-2 次方 (n>2)
1 0
#include<cstdio> #include<cstring> #define mod 1000000007 using namespace std; long long a[3][3],ans[3][3],tmp[3][3]; long long n; void mul(long long s1[3][3],long long s2[3][3]) { memset(tmp,0,sizeof(tmp)); for(int i=1;i<=2;i++) for(int j=1;j<=2;j++) for(int k=1;k<=2;k++) tmp[i][j]=(tmp[i][j]+s1[i][k]*s2[k][j])%mod; for(int i=1;i<=2;i++) for(int j=1;j<=2;j++) s1[i][j]=tmp[i][j]; } void solve() { n-=2; for(;n;n>>=1,mul(a,a)) if(n&1) mul(ans,a); printf("%lld ",ans[1][1]); } int main() { scanf("%lld",&n); if(n==0) { printf("0 "); return 0; } if(n==1||n==2) { printf("1 "); return 0; } a[1][1]=1;a[1][2]=1; a[2][1]=1;a[2][2]=0; ans[1][1]=1;ans[1][2]=1; ans[2][1]=1;ans[2][2]=0; solve(); }