fibonacci数列(二)
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
3
-
描述
-
In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn − 1 + Fn − 2 for n ≥ 2. For example, the first ten terms of the Fibonacci sequence are:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, …
An alternative formula for the Fibonacci sequence is
.
Given an integer n, your goal is to compute the last 4 digits of Fn.
Hint
As a reminder, matrix multiplication is associative, and the product of two 2 × 2 matrices is given by
.
Also, note that raising any 2 × 2 matrix to the 0th power gives the identity matrix:
.
-
输入
- The input test file will contain multiple test cases. Each test case consists of a single line containing n (where 0 ≤ n ≤ 1,000,000,000). The end-of-file is denoted by a single line containing the number −1. 输出
- For each test case, print the last four digits of Fn. If the last four digits of Fn are all zeros, print ‘0’; otherwise, omit any leading zeros (i.e., print Fn mod 10000). 样例输入
-
0 9 1000000000 -1
样例输出
-
0 34 6875
解题方法:
使用矩阵的来解决
1,1
1,0
的n次幂就能得到我们要的结果了
证明和具体的思路课参照网上的资料
下面是实现代码1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 5 using namespace std; 6 7 #define N 10000 8 9 typedef struct matrix 10 { 11 long long a[2][2]; 12 matrix() 13 { 14 memset(a,0,sizeof(a)); 15 } 16 }matrix; 17 18 void chenfa(matrix x,matrix y,matrix &z) 19 { 20 21 z.a[0][0] = (x.a[0][0]*y.a[0][0] + x.a[0][1]*y.a[1][0]) % N; 22 z.a[0][1] = (x.a[0][0]*y.a[0][1] + x.a[0][1]*y.a[1][1]) % N; 23 z.a[1][0] = (x.a[1][0]*y.a[0][0] + x.a[1][1]*y.a[1][0]) % N; 24 z.a[1][1] = (x.a[1][0]*y.a[0][1] + x.a[1][1]*y.a[1][1]) % N; 25 } 26 27 void kuaishu(matrix x,matrix &z,long long n) 28 { 29 z.a[0][0] = 1; 30 z.a[0][1] = 0; 31 z.a[1][0] = 0; 32 z.a[1][1] = 1; 33 34 while(n) 35 { 36 if(n % 2 == 1) 37 chenfa(z,x,z); 38 n /= 2; 39 chenfa(x,x,x); 40 } 41 42 } 43 44 /*void print(matrix z) 45 { 46 int i = 0; 47 int j = 0; 48 for(i = 0; i< 2; i++) 49 { 50 for(j = 0; j< 2;j++) 51 printf("%d ",z.a[i][j]); 52 printf("\n"); 53 } 54 } 55 */ 56 int main() 57 { 58 long long n; 59 while(1) 60 { 61 scanf("%lld",&n); 62 if(n == -1) 63 break; 64 65 if(n < 3) 66 { 67 if(n == 0) 68 printf("0\n"); 69 else 70 printf("1\n"); 71 } 72 else 73 { 74 matrix z; 75 matrix x; 76 x.a[0][0] = 1; 77 x.a[0][1] = 1; 78 x.a[1][0] = 1; 79 x.a[1][1] = 0; 80 kuaishu(x,z,n); 81 //print(z); 82 printf("%lld\n",z.a[0][1]); 83 } 84 } 85 return 0; 86 }