斐波那契数列
题目背景
大家都知道,斐波那契数列是满足如下性质的一个数列:
• 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)范围内。
【解题思路】
矩阵快速幂的模板题
【code】
1 #include <cstdio>
2 #include <iostream>
3 #include <algorithm>
4 #include <cstring>
5 using namespace std;
6 typedef long long LL;
7 LL n;
8 const int mod=1000000007 ;
9 struct Node{
10 LL a[5][5];
11 }f,res;
12 inline void Build_Matrix(Node &x){
13 x.a[1][1]=x.a[2][2]=1;
14 return;
15 }
16 inline void Mult_Matrix(Node &x,Node &y,Node &z){
17 memset(z.a,0,sizeof(z.a));
18 for(register int i=1;i<=2;i++)
19 for(register int j=1;j<=2;j++){
20 if(x.a[i][j]){
21 for(register int k=1;k<=2;k++)
22 z.a[i][k]=(z.a[i][k]+x.a[i][j]*y.a[j][k])%mod;
23 }
24 }
25 return ;
26 }
27 inline void KSM_Matrix(LL k){
28 Node tmp=f,t;
29 while(k){
30 if(k&1){
31 Mult_Matrix(res,tmp,t);
32 res=t;
33 }
34 Mult_Matrix(tmp,tmp,t);
35 tmp=t;
36 k>>=1;
37 }
38 }
39 int main(){
40 scanf("%lld",&n);
41 if(n<=2){
42 printf("1\n");
43 return 0;
44 }
45 Build_Matrix(res);
46 f.a[1][1]=f.a[2][1]=f.a[1][2]=1;
47 KSM_Matrix(n-2);
48 printf("%lld\n",(res.a[1][1]*1+res.a[2][1]*1)%mod);
49 return 0;
50 }
51