求矩阵的幂,采用二分法。很容易理解
#include<iostream>
using namespace std;
const int M=10000;
struct Matrix
{
int v[3][3];
}m;
//求矩阵A*B
Matrix mtMul(Matrix A,Matrix B)
{
Matrix C;
C.v[0][0]=(A.v[0][0]*B.v[0][0]+A.v[0][1]*B.v[1][0])%M;
C.v[0][1]=(A.v[0][0]*B.v[0][1]+A.v[0][1]*B.v[1][1])%M;
C.v[1][0]=(A.v[1][0]*B.v[0][0]+A.v[1][1]*B.v[1][0])%M;
C.v[1][1]=(A.v[1][0]*B.v[0][1]+A.v[1][1]*B.v[1][1])%M;
return C;
}
//求矩阵的k次幂,采用二分法
Matrix mtPow(Matrix A,int k)
{
if(k==1)
return A;
A=mtPow(A,k/2);
if(k%2==0)
return mtMul(A,A);
else
return mtMul(mtMul(A,A),m);
}
int main()
{
//freopen("in.txt","r",stdin);
int n;
//注意该矩阵的选取
m.v[0][0]=0;
m.v[0][1]=1;
m.v[1][0]=1;
m.v[1][1]=1;
while(cin>>n&&n!=-1)
{
if(n==0)
{
cout<<0<<endl;
continue;
}
Matrix A=mtPow(m,n);
cout<<A.v[0][1]<<endl;
}
return 0;
}