矩阵乘法
1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #include <cstdlib> 5 #include <algorithm> 6 #include <string> 7 #include <iostream> 8 #include <stack> 9 #include <map> 10 #include <queue> 11 using namespace std; 12 #define N 15 13 #define INF 0x3f3f3f3f 14 #define MOD 9973 15 int n; 16 17 struct Mat 18 { 19 int mat[N][N]; 20 void init() 21 { 22 memset(mat, 0, sizeof(mat)); 23 } 24 void E() 25 { 26 memset(mat, 0, sizeof(mat)); //构造单位矩阵 27 for(int i = 0; i < n; i++) 28 mat[i][i] = 1; 29 } 30 }; 31 32 Mat operator * (Mat a, Mat b) //矩阵乘法 33 { 34 Mat c; 35 c.init(); 36 for(int i = 0; i < n; i++) { //第一个矩阵的行数 37 for(int j = 0; j < n; j++) { //第二个矩阵的列数 38 for(int k = 0; k < n; k++) { //第一个矩阵的列数 39 c.mat[i][j] = c.mat[i][j] + a.mat[i][k] * b.mat[k][j] % MOD; 40 c.mat[i][j] %= MOD; //要加上这句话 41 } 42 } 43 } 44 return c; 45 } 46 47 Mat operator ^ (Mat a, int k) //矩阵快速幂 48 { 49 Mat p, tmp = a; 50 p.E(); 51 while(k) { 52 if(k & 1) p = p * tmp; 53 tmp = tmp * tmp; 54 k >>= 1; 55 } 56 return p; 57 } 58 59 int main() 60 { 61 int t; 62 scanf("%d", &t); 63 while(t--) { 64 Mat a; 65 int k; 66 scanf("%d%d", &n, &k); 67 for(int i = 0; i < n; i++) 68 for(int j = 0; j < n; j++) 69 scanf("%d", &a.mat[i][j]); 70 Mat ans = a ^ k; 71 int sum = 0; 72 for(int i = 0; i < n; i++) { 73 sum = sum + ans.mat[i][i] % MOD; 74 } 75 printf("%d\n", sum % MOD); 76 } 77 return 0; 78 }