366. 斐波纳契数列

查找斐波那契数列中第n个数。

传送门

题目中的测试用例比较小,不超过int型的存储范围,可以用暴力枚举的方法解决,但是复杂度比较高。所以,本题运用了快速幂求矩阵乘法,时间复杂度有所降低。

代码如下:

 1 #include<iostream>
 2 using namespace std;
 3 
 4 struct matrix
 5 {
 6     int m[2][2];
 7 };
 8 
 9 matrix multi(matrix a, matrix b)
10 {
11     matrix ans;
12     for(int i=0; i<2; i++)
13     {
14         for(int j=0; j<2; j++)
15         {
16             ans.m[i][j]=0;
17             for(int k=0; k<2; k++)
18             {
19                 ans.m[i][j]+=a.m[i][k]*b.m[k][j];
20             }
21         }
22     }
23     return ans;
24 }
25 
26 int calculate(int n)
27 {
28     matrix base,ans;
29     base.m[0][0]=base.m[0][1]=base.m[1][0]=1;
30     base.m[1][1]=0;
31     ans.m[0][0]=ans.m[1][1]=1;
32     ans.m[1][0]=ans.m[0][1]=0;
33     while(n)
34     {
35         if(n&1) ans=multi(ans,base);
36         base=multi(base,base);
37         n>>=1;
38     }
39     return ans.m[0][1];
40 }
41 
42 int main()
43 {
44     int n,ans;
45     cin>>n;
46     ans=calculate(n-1);
47     cout<<ans;
48     return 0;
49 }

 

posted @ 2018-01-23 00:46  magicalzh  阅读(122)  评论(0)    收藏  举报