题意:就是求第n个斐波那契数。
思路:因为 F(n) = F(n-1) + F(n-2);
F(n-1) = F(n-1) + 0*F(n-2);
则有矩阵A [1 1] [F(n-1)] [ F(n) ] [1] [ F(n) ]
[1 0]乘以矩阵[F(n-2)] 等于矩阵[F(n-1)] ,矩阵A的n次方乘以矩阵 [0] 也就等于矩阵[F(n-1)]
所以构造矩阵A 的快速幂,即可。
#include<iostream>
#include<cstdio>
using namespace std;
struct Matrax {
int m[3][3];
};
Matrax A , per;
void Init() { //初始化
for(int i = 0 ; i < 2 ; i ++) {
for (int j = 0 ; j < 2 ; j ++) {
per.m[i][j] = (i == j);
if(i==1&&j==1) A.m[i][j] = 0;
else A.m[i][j] = 1;
}
}
}
Matrax multi(Matrax a , Matrax b) {
int i , j , k;
Matrax c;
for(i = 0 ; i < 2 ; i ++)
for(j = 0 ; j < 2 ; j ++) {
c.m[i][j] = 0;
for(k = 0 ; k < 2 ; k ++) {
c.m[i][j] += a.m[i][k]*b.m[k][j];
c.m[i][j]%=10000;
//printf("%d\n",c.m[i][j]);
}
}
return c;
}
Matrax power(__int64 k) {
Matrax ans , p;
ans = per;
p = A;
while (k) {
if(k&1) {
ans = multi(ans , p);
}
k/=2;
p = multi(p , p);
}
return ans;
}
int main() {
__int64 k;
while(scanf("%I64d",&k)!=EOF) {
if(k == -1) break;
Init();
Matrax ans;
ans = power(k);
printf("%d\n",ans.m[1][0]%10000);
}
}