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;
		}
	}
};