#include <algorithm> #include <iostream> #include <cstring> #include <cstdlib> #include < cstdio> #include <queue> #include <cmath> #include <stack> #include <map> #pragma comment ( linker, "/stack:1024000000") #define EPS (1e-8) #define LL long long#define ULL unsigned long long#define INF 0x3f3f3f3fusin G namespace Std;const int maxn = 61;struct mat{int row,col; int MAT[MAXN][MAXN]; void Init (int r,int c,int val) {row = R,col = C; for (int i = 1;i <= row, ++i) for (int j = 1;j <= col; ++j) mat[i][j] = (i = = J val: 0); } Mat Multi (Mat c,int MOD) {mat tmp; Tmp. Init (this->row,c.col,0); int i,j,k; for (i = 1;i <= tmp.row, ++i) for (j = 1;j <= Tmp.col; ++j) for (k = 1;k <= this->col; ++K) (Tmp.mat[i][j] + = This->mat[i][k]*c.mat[k][j])%= MOD; return TMP; } MAT Quick (int n,int MOD) {MAT res,tmp = *this; Res. Init (row,col,1); while (n) {if (n&1) res = res. Multi (TMP,MOD); TMP = tmp. Multi (TMP,MOD); n >>= 1; } return res; } void Output () {cout<< "****************" <<endl; int i,j; for (i = 1;i <= row; ++i) {for (j = 1;j <= col; ++j) printf ("%3d", Mat[i][j]); Puts (""); } cout<< "&&&&&&&&&&&&&" <<endl; }};int Main () {freopen ("data1.in", "R", stdin); int T; scanf ("%d", &t); MAT A; int n,m,i,j,sum; while (t--) {scanf ("%d%d", &n,&m); A.init (n,n,0); for (i = 1;i <= n; ++i) for (j = 1;j <= n; ++j) scanf ("%d", &a.mat[i][j]); A = A.quick (m,9973); for (sum = 0, i = 1;i <= N; ++i) (sum + = A.mat[i][i])%= 9973; printf ("%d\n", sum); } return 0;}
See also matrix fast power template paste up