Problem Description
A为一个方阵,则Tr A表示A的迹(就是主对角线上各项的和),现要求Tr(A^k)%9973。
Input
数据的第一行是一个T,表示有T组数据。
每组数据的第一行有n(2 <= n <= 10)和k(2 <= k < 10^9)两个数据。接下来有n行,每行有n个数据,每个数据的范围是[0,9],表示方阵A的内容。
Output
对应每组数据,输出Tr(A^k)%9973。
Sample Input
2
2 2
1 0
0 1
3 99999999
1 2 3
4 5 6
7 8 9
Sample Output
2
2686
# include <iostream>
# include <cstdio>
# include <algorithm>
# include <map>
# include <cmath>
# define LL long long
using namespace std ; const int MAX = ;
const int MOD = ;
int n ; //n*n 矩阵 struct Matrix
{
int mat[MAX][MAX];
};
Matrix mul(Matrix a,Matrix b) //矩阵乘法
{
Matrix c;
for(int i=;i<n;i++)
for(int j=;j<n;j++)
{
c.mat[i][j]=;
for(int k=;k<n;k++)
{
c.mat[i][j]=(c.mat[i][j] + a.mat[i][k]*b.mat[k][j])%MOD;
}
}
return c;
}
Matrix pow_M(Matrix a,int k) //矩阵快速幂
{
Matrix ans;
memset(ans.mat,,sizeof(ans.mat));
for (int i=;i<n;i++)
ans.mat[i][i]=;
Matrix temp=a;
while(k)
{
if(k&)ans=mul(ans,temp);
temp=mul(temp,temp);
k>>=;
}
return ans;
}
int main ()
{
//freopen("in.txt","r",stdin) ;
int T ;
scanf("%d" , &T) ;
while(T--)
{
int k ;
Matrix s ;
Matrix ans ;
scanf("%d %d" , &n , &k) ;
for (int i = ; i < n ; i++)
for (int j = ; j < n ; j++)
scanf("%d" , &s.mat[i][j]) ;
ans = pow_M(s,k) ;
int sum = ;
for (int i = ; i < n ; i++)
sum= (sum + ans.mat[i][i]) % MOD ;
printf("%d\n" , sum) ; } return ;
}