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

posted @ 2010-08-31 00:37  菜到不得鸟  阅读(494)  评论(0)    收藏  举报