斐波那契数列

题目背景

大家都知道,斐波那契数列是满足如下性质的一个数列:

• 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  

 

posted @ 2019-09-07 15:26  GTR_PaulFrank  阅读(130)  评论(0编辑  收藏  举报