【题目描述】
A为一个方阵,则Tr A表示A的迹(就是主对角线上各项的和),现要求Tr(A^k)%9973。
【输入描述】
数据的第一行是一个T,表示有T组数据;
每组数据的第一行有n(2 <= n <=
10)和k(2 <= k < 10^9)两个数据。接下来有n行,每行有n个数据,每个数据的范围是[0,9],表示方阵A的内容。
【输出描述】
对应每组数据,输出Tr(A^k)%9973。
【样例输入】
2
2 2
1 0
0 1
3 99999999
1 2 3
4 5 6
7 8 9
【样例输出】
2
2686
源代码: #include<cstdio> int n,m,k,i[11][11]; int Solve() { int i1[11][11],i2[11][11],sum[11][11]={0}; for (int a=1;a<=m;a++) sum[a][a]=1; //右降对角线皆为1的方形矩阵等价于快速幂中的ans=1。 while (k) { if (k&1) { for (int a=1;a<=m;a++) for (int b=1;b<=m;b++) { i1[a][b]=sum[a][b]; //开个小白鼠数组防止出错。 sum[a][b]=0; } for (int a=1;a<=m;a++) for (int b=1;b<=m;b++) for (int c=1;c<=m;c++) sum[a][b]=(sum[a][b]+(i1[a][c]*i[c][b])%9973)%9973; //sum[i][j]=∑(sum[i][X]*sum[X][j])。 } for (int a=1;a<=m;a++) for (int b=1;b<=m;b++) { i1[a][b]=i2[a][b]=i[a][b]; i[a][b]=0; } for (int a=1;a<=m;a++) for (int b=1;b<=m;b++) for (int c=1;c<=m;c++) i[a][b]=(i[a][b]+i1[a][c]*i2[c][b])%9973; k=k>>1; } int ans(0); for (int a=1;a<=m;a++) //真尼玛坑爹。 ans=(ans+sum[a][a])%9973; return ans; } int main() { scanf("%d",&n); for (int a=0;a<n;a++) { scanf("%d%d",&m,&k); for (int a=1;a<=m;a++) for (int b=1;b<=m;b++) scanf("%d",&i[a][b]); printf("%d ",Solve()); } return 0; }