struct block{
#define MOD 10000
long long x[101][101],l,h;
void print()
{
for (long long i=1;i<=h;i++){
for (long long j=1;j<=l;j++){
cout<<x[i][j]<<' ';
}
cout<<endl;
}
cout<<endl;
}
block operator *(block const &a) const {
block r;
for (long long i=1;i<=l;i++){
for (long long j=1;j<=h;j++){
for (long long k=1;k<=h;k++){
r.x[i][j]+=(x[i][k]*a.x[k][j])%MOD;
}
}
}
r.h=a.h;
r.l=l;
return r;
}
block operator ^(long long const &a) const {
block r,d;
long long p=a;
d.h=h,d.l=l;
r.h=d.h,r.l=d.l;
for (long long i=1;i<=min(r.h,r.l);i++){
r.x[i][i]=1;
}
for (long long i=1;i<=l;i++){
for (long long j=1;j<=h;j++){
d.x[i][j]=x[i][j];
}
}
while (p>0){
if (p%2==1){
r=r*d;
}
d=d*d;
p/=2;
}
return r;
}
};