题意:求矩阵A的k次幂的主对角线上元素和模9973((2 <= 矩(方)阵维数n <= 10)和k(2 <= k < 10^9))。
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1575
——>>矩阵快速幂。。。
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 10 + 5;
const int mod = 9973;
int n, k;
struct Mar{
int m[maxn][maxn];
Mar(){
memset(m, 0, sizeof(m));
}
};
Mar operator + (Mar a, Mar b){
Mar ret;
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++) ret.m[i][j] = (a.m[i][j] + b.m[i][j]) % mod;
return ret;
}
Mar operator * (Mar a, Mar b){
Mar ret;
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
for(int l = 0; l < n; l++) ret.m[i][j] = (ret.m[i][j] + a.m[i][l] * b.m[l][j]) % mod;
return ret;
}
Mar pow_mod(Mar a, int n){
if(n == 1) return a;
Mar x = pow_mod(a, n/2);
x = x * x;
if(n&1) x = x * a;
return x;
}
void solve(){
Mar A;
int i, j, ret = 0;
for(i = 0; i < n; i++)
for(j = 0; j < n; j++) scanf("%d", &A.m[i][j]);
A = pow_mod(A, k);
for(i = 0; i < n; i++) ret = (ret + A.m[i][i]) % mod;
printf("%d\n", ret);
}
int main()
{
int T;
scanf("%d", &T);
while(T--){
scanf("%d%d", &n, &k);
solve();
}
return 0;
}