-
题目描述:
-
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 <stdio.h> #define M 9973 struct Matrix { int m[11][11]; }; int n; Matrix mul(Matrix a, Matrix b) { int i,j,k; Matrix c; for(i=1;i<=n;i++) for(j=1;j<=n;j++) { c.m[i][j] = 0; for(k=1;k<=n;k++) c.m[i][j] += (a.m[i][k] * b.m[k][j]) % M; c.m[i][j] %= M; } return c; } Matrix E; Matrix pow(Matrix a, int k) { Matrix c = E; while(k) { if(k%2==1) c = mul(c,a); a = mul(a,a); k /= 2; } return c; } int main() { int t,k; while(scanf("%d",&t)!=EOF) { int i,j,l; for(i=0;i<t;i++) { scanf("%d %d",&n,&k); for(j=1;j<=n;j++) for(l=1;l<=n;l++) { if(j==l) E.m[j][l] = 1; else E.m[j][l] = 0; } Matrix tmp; for(j=1;j<=n;j++) for(l=1;l<=n;l++) scanf("%d",&tmp.m[j][l]); tmp = pow(tmp,k); int ans=0; for(j=1;j<=n;j++) ans += tmp.m[j][j] % M; printf("%d\n",ans%M); } } return 0; }
样例输出: