Loading

矩阵乘法

 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 }

 

posted @ 2016-10-08 19:19  Shadowdsp  阅读(278)  评论(0编辑  收藏  举报