一般来说遇到这种递推的题目,或者说变化形式是一种线性递推的运算,我们就可以初步判断这道题目是矩阵乘法了.
#define mod 10000
struct matrix{ll x[3][3];};
matrix multi(matrix a,matrix b)//矩阵相乘
{
matrix temp;
memset(temp.x,0,sizeof(temp.x));
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
for(int k=0;k<2;k++)
{
temp.x[i][j]+=a.x[i][k]*b.x[k][j];
temp.x[i][j]%=mod;//负数取模的问题,除法取模
}
return temp;
}
matrix quick_multi(matrix a,ll n)//矩阵快速幂
{
matrix temp=a;
n--;
while(n){
if(n&1)
temp=multi(temp,a);
a=multi(a,a);
n>>=1;
}
return temp;
}
int main()
{
int n;
while(cin>>n)
{
if(n<0) break;
if(n==0) cout<<0<<endl;
else if(n==1) cout<<1<<endl;
else
{
matrix ans;
ans.x[0][0] = 1,ans.x[0][1] = 1,ans.x[1][0] = 1,ans.x[1][1] = 0;
--n;
ans = quick_multi(ans,n);
matrix tmp;
tmp.x[0][0] = 1,tmp.x[0][1] = tmp.x[1][0] = tmp.x[1][1] = 0;
ans= multi(ans,tmp);
cout<<ans.x[0][0]<<endl;
}
}
return 0;
}