1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
| #include <iostream> #include <cstdio> #include <string> #include <cstring> using namespace std; const int MAXN = 15; const int MOD = 1e8;
struct node { int mat[MAXN][MAXN]; int row, col; void init(){ memset(mat, 0, sizeof(mat)); for (int i = 0; i < row; i++){ for (int j = 0; j < col; j++){ mat[i][j] = (i==j); } } } };
node mod_mul(node a, node b, int p) { node ans; ans.row = a.row; ans.col = b.col; memset(ans.mat, 0, sizeof(ans.mat)); for (int i = 0; i < ans.row; i++) for (int j = 0; j < ans.col; j++) for (int k = 0; k < a.col; k++) { ans.mat[i][j] += a.mat[i][k] * b.mat[k][j]; ans.mat[i][j] %= p; } return ans; }
node mod_pow(node a, int k, int p) { node ans; ans.row = a.row; ans.col = a.col; ans.init(); while (k){ if (k & 1) ans = mod_mul(ans, a, p); a = mod_mul(a, a, p); k >>= 1; } return ans; }
int main() { node m; int n, k; while (scanf("%d%d", &n, &k)!=EOF) { for (int i = 0; i < n; i++) for (int j = 0; j < n; j++){ scanf("%d", &m.mat[i][j]); m.mat[i][j] %= MOD; } m.col = m.row = n; node ans = mod_pow(m, k, MOD); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (j != 0) printf(" "); printf("%d", ans.mat[i][j]); } printf("\n"); } } return 0; }
|