hdu 1575 Tr A
#include <stdio.h>
#define MAXN 20
#define MOD 9973
struct Matrix
{
Matrix(int,int);
Matrix(int,int,int arr[MAXN][MAXN]);
friend Matrix operator*(const Matrix &,const Matrix &);
int r,c,a[MAXN][MAXN];
};
Matrix::Matrix(int rr,int cc)
{
r=rr;
c=cc;
for(int i=0; i<r; i++)
for(int j=0; j<c; j++)
if(i==j) a[i][j]=1;
else a[i][j]=0;
}
Matrix::Matrix(int rr,int cc,int arr[MAXN][MAXN])
{
r=rr;
c=cc;
for(int i=0; i<r; i++)
for(int j=0; j<c; j++)
a[i][j]=arr[i][j];
}
Matrix operator*(const Matrix &m1,const Matrix &m2)
{
Matrix m3(m1.r,m2.c);
int i,j,k;
for(i=0; i<m1.r; i++)
{
for(j=0; j<m2.c; j++)
{
m3.a[i][j]=0;
for(k=0; k<m1.c; k++)
{
m3.a[i][j] = (m3.a[i][j]+m1.a[i][k]*m2.a[k][j]) % MOD;
}
}
}
return m3;
}
Matrix solve(Matrix a,int n)
{
Matrix s(a.r,a.c);
while(n)
{
if(n&1) s=s*a;
a=a*a;
n>>=1;
}
return s;
}
int main()
{
int T,n,i,j,k,t,tmp[MAXN][MAXN];
scanf("%d",&T);
while(T--)
{
scanf("%d %d",&n,&k);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&t);
tmp[i][j]=t%MOD;
}
}
Matrix a(n,n,tmp),s(n,n);
s=solve(a,k);
t=0;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(i==j) t=(t+s.a[i][j]) % MOD;
}
}
printf("%d\n",t);
}
return 0;
}
浙公网安备 33010602011771号