这题用矩阵快速幂很好写,矩阵相乘其实很简单,然后快速幂也很简单,就是让矩阵做乘法的时候,使用快速幂的思想就可以了,写代码的时候要注意,快速幂之前,ans数组是单位阵,res是用来求斐波那契的矩阵,然后我们返回数组并不方便,所以直接赋值就可以了,但是局部变量中,数组的初始值并不是0,所以需要初始化。
#include <iostream>
#include <cstdio>
int a[25];
int n;
const int ONum = 2;
const int mod = 10000;
int res[ONum][ONum];
int ans[ONum][ONum];
void MaxtrixMul(int a[][ONum],int b[][ONum])
{
int tmp[ONum][ONum];
for (int i = 0; i < ONum;i++) {
for (int j = 0; j < ONum;j++) {
tmp[i][j] = 0;
}
}
for (int i = 0; i < ONum; i++)
{
for (int j = 0; j < ONum; j++)
{
for (int k = 0; k < ONum; k++)
{
tmp[i][j] =(tmp[i][j] + a[i][k] * b[k][j]) % mod;
}
}
}
for (int i = 0; i < ONum;i++) {
for (int j = 0; j < ONum;j++) {
a[i][j] = tmp[i][j];
}
}
}
void MaxtrixQuickpow(int num)
{
ans[0][0] = ans[1][1] = 1;
res[0][0] = res[0][1] = res[1][0] = 1;
ans[1][0] = ans[0][1] = res[1][1] = 0;
while (num) {
if (num&1) {
MaxtrixMul(ans, res);
}
MaxtrixMul(res, res);
num >>= 1;
}
}
int main()
{
a[1] = 1;
for (int i = 2; i <= 20;i++) {
a[i] = a[i - 1] + a[i - 2];
}
while (scanf("%d", &n) && n != -1) {
if (n <= 20) {
printf("%d
", a[n]);
continue;
}
MaxtrixQuickpow(n-1);
printf("%d
", ans[0][0]);
}
return 0;
}
/*
1000000000
*/