题目中所给的方阵就是一个矩阵,而就是只要将题目所给矩阵不断进行相乘即可,本题中我采用的是直接重载运算符*,使矩阵每一个都进行运算,可以简化为只对对角线上的元素进行运算。最后所得结果就只需将最终的矩阵上的对角线上的数相加即可。快速幂即是将指数进行质因子分解,从而减少运算,比如15=7*2+1,而7=3*2+1,3=2*1+1,如此便只需3步即可求出15。

代码如下:

#include<cstdio>
#include<cstring>
using namespace std;

const int maxn=10;

struct Matrix
{
    long long  mat[maxn][maxn];
    Matrix operator*(const Matrix& m)const///重载*运算符,使其能进行矩阵相乘的运算
    {
        Matrix tmp;
        for(int i = 0 ; i < maxn ; i++)
        {
            for(int j = 0 ; j < maxn ; j++)
            {
                tmp.mat[i][j] = 0;
                for(int k = 0 ; k < maxn ; k++)
                {
                    tmp.mat[i][j] += mat[i][k]*m.mat[k][j];
                    tmp.mat[i][j] %= 9973;
                }
            }
        }
        return tmp;
    }
};

long long  PowerMod(Matrix a, long long b,int n)
{
    long long sum=0;
    Matrix ans;
    memset(ans.mat,0,sizeof(ans.mat));
    for(int i=0;i<n;i++)
        ans.mat[i][i]=1;
    while(b)
    {
        if(b&1) ans=ans*a;
        b>>=1;
        a=a*a;
    }
    for(int i=0;i<n;i++)
    {
        sum+=ans.mat[i][i];
        sum%=9973;
    }
    return sum;
}

int main()
{
    int n,t;
    long long k;
    while(~scanf("%d",&t))
    {
        while(t--)
        {
            Matrix input;
            memset(input.mat,0,sizeof(input.mat));
            scanf("%d%lld",&n,&k);
            for(int i=0; i<n; i++)
                for(int j=0; j<n; j++)
                    scanf("%d",&input.mat[i][j]);
            printf("%lld\n",PowerMod(input, k,n));
        }
    }
    return 0;
}