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 }

浙公网安备 33010602011771号