题目链接:http://poj.org/problem?id=3070
创建如下矩阵求解递推式Fn项的值:
代码如下:
#include <cstdio>
#include <cstring>
const int mod = 10000;
const int matSize = 2;
struct Mat
{
int val[matSize][matSize];
void init() { memset(val,0,sizeof(val)); }
void set1() { // 把矩阵置为单位矩阵
for(int i=0; i<matSize; i++)
for(int j=0; j<matSize; j++)
val[i][j] = (i == j);
}
friend Mat operator*(Mat a, Mat b) // 重载*号进行矩阵乘法
{
Mat res;
res.init();
for(int i=0; i<matSize; i++) {
for(int k=0; k<matSize; k++) {
if(a.val[i][k]) {
for(int j=0; j<matSize; j++) {
res.val[i][j] += a.val[i][k]*b.val[k][j];
res.val[i][j] %= mod;
}
}
}
}
return res;
}
friend Mat operator^(Mat a, int x) // 重载^号进行快速幂运算
{
Mat res;
res.set1();
while(x)
{
if(x & 1) res = res * a;
a = a * a;
x >>= 1;
}
return res;
}
};
Mat A;
Mat B;
void init()
{
A.val[0][0] = 1;
A.val[0][1] = 1;
A.val[1][0] = 1;
A.val[1][1] = 0;
}
int main()
{
int n;
init();
while(scanf("%d", &n), ~n) {
B = A^n;
printf("%d\n", B.val[0][1]);
}
return 0;
}