A为一个方阵,则Tr A表示A的迹(就是主对角线上各项的和),现要求Tr(A^k)%9973。
每组数据的第一行有n(2 <= n <= 10)和k(2 <= k < 10^9)两个数据。接下来有n行,每行有n个数据,每个数据的范围是 0,9 ,表示方阵A的内容。
2 2 2 1 0 0 1 3 99999999 1 2 3 4 5 6 7 8 9
2 2686
/*
题解:
矩阵快速幂基础题,没什么好说的
*/
#include <stdio.h>
#include <string.h>
#include<iostream>
#include <algorithm>
#include<math.h>
#include<map>
using namespace std;
struct node
{
int maxtri[12][12];
};
node res, roi;
int k, n;
node muti(node ss, node tt)
{
node ans;
memset(ans.maxtri, 0, sizeof(ans.maxtri));
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
for (int kk = 1; kk <= n; kk++)
ans.maxtri[i][j] = (ans.maxtri[i][j] + ss.maxtri[i][kk] * tt.maxtri[kk][j] % 9973) % 9973;
}
}
return ans;
}
void quickmuti(int nn)
{
while (nn)
{
if (nn & 1)
{
res = muti(res, roi);
}
nn >>= 1;
roi = muti(roi, roi);
}
}
int main()
{
int t;
cin >> t;
while (t--)
{
cin >> n >> k;
memset(res.maxtri, 0, sizeof(res.maxtri));
for (int i = 1; i <= n; i++)
{
res.maxtri[i][i] = 1;
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
cin >> roi.maxtri[i][j];
}
}
quickmuti(k);
int sum = 0;
for (int i = 1; i <= n; i++)
{
sum = (sum + res.maxtri[i][i]) % 9973;
}
cout << sum << endl;
}
return 0;
}