Fibonacci
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.
Input
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.
Output
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).
Sample Input
0 9 999999999 1000000000 -1
Sample Output
0 34 626 6875
用矩阵运算,只算最后四位数,最后输出。。。
#include <cstdio>
#include <string.h>
int mp[3][3], ans[3][3], kk[3][3];
void mul(int a[3][3], int b[3][3]){//矩阵相乘运算
for(int i = 1; i <= 2; i++ ){
for(int j = 1; j <= 2; j++ ){
mp[i][j] = 0;
for(int k = 1; k <=2; k++ ){
mp[i][j] += (a[i][k] * b[k][j]) % 10000;
mp[i][j] %= 10000;
}
}
}
memcpy(ans, mp, sizeof(mp));
}
void pow(int k){//计算A^k 如果 k 为偶数 那么 A^k = A^(k/2)*A(k/2)
if(k == 1 || k == 0){
return;
}
pow(k / 2);
if(k % 2 == 0){
mul(ans, ans);
}
else{
mul(ans, ans);
mul(ans, kk);
}
}
void init(){
kk[1][1] = kk[1][2] = kk[2][1] = 1;
kk[2][2] = 0;
ans[1][1] = ans[1][2] = ans[2][1] = 1;
ans[2][2] = 0;
}
int main(){
int x;
while(scanf("%d", &x) && x != -1){
init();
pow(x);
if(x == 0)
printf("0\n");
else
printf("%d\n", ans[1][2]);
}
}