矩阵已经给出来了,直接算就行了。
和普通的快速幂差不多,只不过多了一个矩阵乘法。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
#define LL long long
#define maxn 110000
#define maxm 110000
#define MOD 10000
using namespace std;
struct mat{
int at[2][2];
};
mat mul(mat a,mat b,int n)
{
mat t;
memset(t.at,0,sizeof(t.at));
for(int i=0;i<n;++i)
{
for(int k=0;k<n;++k)
{
if(a.at[i][k])
for(int j=0;j<n;++j)
{
t.at[i][j]+=a.at[i][k]*b.at[k][j];
if(t.at[i][j]>=MOD){t.at[i][j]%=MOD;}
}
}
}
return t;
}
mat expo(mat p,int k,int n)
{
if(k==1)return p;
mat e;
memset(e.at,0,sizeof(e.at));
for(int i=0;i<n;++i){e.at[i][i]=1;}
if(k==0)return e;
while(k)
{
if(k&1)e=mul(p,e,n);
p=mul(p,p,n);
k>>=1;
}
return e;
}
int main()
{
int n;
while(scanf("%d",&n),n!=-1)
{
mat temp;
temp.at[0][0]=temp.at[0][1]=1;
temp.at[1][0]=1,temp.at[1][1]=0;
printf("%d\n",expo(temp,n,2).at[0][1]);
}
}