题意:一个斐波那契序列f,给出n,问fn是多少。
题解:因为题目中还给出了一个矩阵公式,用矩阵快速幂的方式解答。
#include <stdio.h>
#include <string.h>
const int MOD = 10000;
struct Matrix {
int a[2][2];
}f, ori;
int n;
void init() {
ori.a[0][0] = 1;
ori.a[0][1] = 1;
ori.a[1][0] = 1;
ori.a[1][1] = 0;
f.a[0][0] = 1;
f.a[0][1] = 0;
f.a[1][0] = 0;
f.a[1][1] = 1;
}
Matrix multiply(Matrix x, Matrix y) {
Matrix temp;
memset(temp.a, 0, sizeof(temp.a));
for (int i = 0; i < 2; i++)
for (int j = 0; j < 2; j++)
for (int k = 0; k < 2; k++)
temp.a[i][j] = (temp.a[i][j] + (x.a[i][k] * y.a[k][j]) % MOD) % MOD;
return temp;
}
void calc(int n) {
while (n) {
if (n & 1)
f = multiply(f, ori);
n >>= 1;
ori = multiply(ori, ori);
}
}
int main() {
while (scanf("%d", &n) && n != -1) {
init();
calc(n);
printf("%d\n", f.a[1][0]);
}
return 0;
}