对于满足(
F
0
= 0,
F
1
= 1, and
Fn
=
Fn
− 1
+
Fn
− 2
for
n
≥ 2)的斐波那契数列,第n项可由矩阵求出公式如下:
///2014.2.24
///poj3070
#include <iostream>
#include <vector>
#include <cstdio>
using namespace std;
#define MOD 10000
//定义二阶矩阵
struct MATRIX
{
long long f11;
long long f12;
long long f21;
long long f22;
};
//定义二阶矩阵乘法函数
MATRIX matMulti(MATRIX mat1, MATRIX mat2)
{
MATRIX matrix;
matrix.f11 = (mat1.f11*mat2.f11 + mat1.f12*mat2.f21)%MOD;
matrix.f12 = (mat1.f11*mat2.f12 + mat1.f12*mat2.f22)%MOD;
matrix.f21 = (mat1.f21*mat2.f11 + mat1.f22*mat2.f21)%MOD;
matrix.f22 = (mat1.f21*mat2.f12 + mat1.f22*mat2.f22)%MOD;
return matrix;
}
MATRIX Fibo(int m)
{
MATRIX unitMat,retMat;
unitMat.f11 = (long long)1;
unitMat.f12 = (long long)1;
unitMat.f21 = (long long)1;
unitMat.f22 = (long long)0;
if(m==1)
{
retMat.f11 = (long long)1;
retMat.f12 = (long long)1;
retMat.f21 = (long long)1;
retMat.f22 = (long long)0;
}
else if(m%2 == 0)
{
retMat = Fibo(m/2);
retMat = matMulti(retMat,retMat);
}
else if(m%2 == 1)
{
retMat = Fibo((m-1)/2);
retMat = matMulti(retMat,retMat);
retMat = matMulti(retMat,unitMat);
}
return retMat;
}
int main()
{
// freopen("in","r",stdin);
// freopen("out","w",stdout);
int m;
vector<int> output;
MATRIX retMatrix;
while( cin>>m && m!=-1)
{
if(m==0)
{
output.push_back(0);
}
else
{
retMatrix = Fibo(m);
output.push_back( retMatrix.f12 % 10000 );
}
}
for(vector<int>::size_type i=0; i<output.size(); i++)
cout<<output[i]<<endl;
return 0;
}