题目链接:
http://poj.org/problem?id=3070
题目大意:
给出一个2X2的固定矩阵,问这个矩阵的N次方后Fn位置的数字是多少
题解:
矩阵快速幂模板题
AC代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define N 3
using namespace std;
struct Mat
{
int mat[N][N];
};
Mat operator *(Mat a, Mat b)
{
Mat c;
memset(c.mat, 0 ,sizeof(c.mat));
for(int k = 0; k < N; k++)
{
for(int i = 0; i < N; i++)
{
for(int j = 0; j < N; j++)
{
c.mat[i][j] += a.mat[i][k] * b.mat[k][j] % 10000;
}
}
}
return c;
}
Mat operator ^ (Mat a, int k)
{
Mat c;
int i, j;
for(int i = 0; i < N; i++)
for(int j = 0; j < N; j++)
c.mat[i][j] = (i == j);
for(;k;k >>= 1)
{
if(k&1)
c = c*a;
a = a*a;
}
return c;
}
Mat a;
void init()
{
a.mat[0][0] = 1;
a.mat[0][1] = 1;
a.mat[1][0] = 1;
a.mat[1][1] = 0;
}
int main()
{
int n;
while(cin >> n)
{
if(n == -1)break;
init();
Mat b;
b = a ^ n;
cout << b.mat[1][0] % 10000 <<endl;
}
return 0;
}