struct mat
{
int n,m;
int a[maxn][maxn];
void zero()
{
memset(a,0,sizeof(a));
}
void one()
{
zero();
for(int i=1;i<=n;i++)
{
a[i][i]=i;
}
}
void resize(int x,int y)
{
n=x;
m=y;
}
mat operator+(const mat&A)const
{
mat res;
res.resize(n,m);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
res.a[i][j]=(a[i][j]+A.a[i][j])%mod;
}
}
return res;
}
mat operator-(const mat&A)const
{
mat res;
res.resize(n,m);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;i++)
{
res.a[i][j]=(a[i][j]-A.a[i][j])%mod;
}
}
return res;
}
mat operator*(const mat&A)const
{
mat res;
res.resize(n,A.m);
res.zero();
for(int i=1;i<=n;i++)
{
for(int j=1;j<=A.m;j++)
{
for(int k=1;k<=m;k++)
{
res.a[i][j]=(a[i][k]*A.a[k][j]+res.a[i][j]);
}
}
}
return res;
}
void out()
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cout <<a[i][j]<<" ";
}
cout <<endl;
}
}
};