Fibonacci数列的高速幂算法

Fibonacci数列的快速幂算法

设Fibonacci数列定义为:

Fibonacci数列的高速幂算法

请用矩阵快速幂方法,即利用以下公式求Fibonacci数列第n项。

Fibonacci数列的高速幂算法

本题不涉及高精度数。

 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 }