struct matrix
{
int n,m;
int a[MAXN][MAXN];
matrix(int x,int y)
{
n=x;
m=y;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
a[i][j]=0;
}
int *operator[](int i)
{
return a[i];
}
void init()
{
for(int i=1;i<=n;i++)
a[i][i]=1;
}
matrix operator+(matrix b)
{
matrix ans(n,m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
ans[i][j]=a[i][j]+b[i][j];
return ans;
}
matrix operator*(matrix &b)
{
matrix ans(n,b.m);
for(int i=1;i<=ans.n;i++)
for(int j=1;j<=ans.m;j++)
for(int k=1;k<=m;k++)
ans[i][j]+=a[i][k]*b[k][j];
return ans;
}
friend matrix operator^(matrix a,int k)
{
matrix res(a.n,a.n);
res.init();
while(k)
{
if(k&1)
res=res*a;
a=a*a;
k>>=1;
}
return res;
}
matrix print()
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
printf("%d ",a[i][j]);
printf("\n");
}
}
};
|