设Fibonacci数列定义为:
请用矩阵快速幂方法,即利用以下公式求Fibonacci数列第n项。
本题不涉及高精度数。
1 #include<stdio.h> 2 typedef struct matrix{ 3 int m[2][2]; 4 }matrix; 5 6 matrix multi(matrix a, matrix b) 7 { 8 int i, j, k; 9 matrix tmp; 10 for( i = 0; i < 2; ++i) 11 { 12 for( j = 0; j < 2; ++j) 13 { 14 tmp.m[i][j] = 0; 15 for( k = 0; k < 2; ++k) 16 tmp.m[i][j] += a.m[i][k] * b.m[k][j]; 17 } 18 } 19 return tmp; 20 } 21 int fast(int n) // 求矩阵 base 的 n 次幂 22 { 23 matrix ans, base; 24 base.m[0][0] = base.m[0][1] = base.m[1][0] = 1; 25 base.m[1][1] = 0; 26 ans.m[0][0] = ans.m[1][1] = 1; // ans 初始化为单位矩阵 27 ans.m[0][1] = ans.m[1][0] = 0; 28 while(n) 29 { 30 if(n & 1) 31 { 32 ans = multi(ans, base); 33 } 34 base = multi(base, base); 35 n >>= 1; 36 } 37 return ans.m[0][1]; 38 } 39 40 int main() 41 { 42 int n; 43 while(scanf("%d", &n)!=EOF) 44 { 45 printf("%d\n", fast(n)); 46 } 47 return 0; 48 }
时间: 2024-10-30 03:02:23