A为一个方阵,则Tr A表示A的迹(就是主对角线上各项的和),现要求Tr(A^k)%9973
#include <iostream>
#include <cstdio>
#include <cstring>
using namespacestd;
const int mod =9973;
struct matrix{
long long num[12][12];
};
matrix multiple(matrix &a,matrix &b,int n)//矩阵相乘
{
matrix c;
memset(c.num,0, sizeof(c.num));
for (int i =0; i < n; i ++) {
for (int j =0; j < n; j ++) {
for (int k =0 ;k < n; k ++) {
c.num[i][j] += a.num[i][k] * b.num[k][j];
}
c.num[i][j] = c.num[i][j] %mod;//因为加法和乘法都是从后向前进行的,若求取余后的结果,在计算过程中也只有后几位影响结果,所以数过大时可前取余再计算。
}
}
return c;
}
int main()
{
int T;
cin >> T;
while (T --) {
int n,k;
cin >> n >> k;
matrix a;
for (int i =0; i < n; i ++) {
for (int j =0; j < n; j ++) {
scanf("%lld",&a.num[i][j]);
}
}
matrix res;//res要初始化为单位矩阵
memset(res.num,0, sizeof(res.num));
for (int i =0; i < n; i ++) {
res.num[i][i] =1;
}
while(k)//快速幂核心,通过二进制减少相乘次数
{
if(k &1) res = multiple(res, a, n);
k >>= 1;
a = multiple(a, a, n);
}
longlong sum = 0;
for (int i =0; i < n; i ++) {
sum = (sum + res.num[i][i]) %mod;
}
cout << sum <<endl;
}
return0;
}