#define _CRT_SECURE_NO_WARNINGS 1
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 100;
struct Matrix {
int row, col;
int matrix[MAXN][MAXN];
Matrix(int x, int y): row(x), col(y) {}
};
Matrix add_matrix(Matrix x, Matrix y) {
Matrix ansever = Matrix(x.row, x.col);
for (int i = 0; i < ansever.row; i++) {
for (int j = 0; j < ansever.col; j++) {
ansever.matrix[i][j] = x.matrix[i][j] + y.matrix[i][j];
}
}
return ansever;
}
Matrix mutiple(Matrix x, Matrix y) {
Matrix ansever = Matrix(x.row, y.col);
for (int i = 0; i < ansever.row; i++) {
for (int j = 0; j < ansever.col; j++) {
ansever.matrix[i][j] = 0;
for (int k = 0; k < x.col; k++) {
ansever.matrix[i][j] += x.matrix[i][k] * y.matrix[k][j];
}
}
}
return ansever;
}
Matrix Quickpover(Matrix x, int n) {
Matrix ansever(x.row, x.col);
for (int i = 0; i < x.row; i++) { //初始化别忘了,初始化为单位矩阵
for (int j = 0; j < x.col; j++) {
if (i == j)ansever.matrix[i][j] = 1;
else ansever.matrix[i][j] = 0;
}
}
while (n != 0) {
if (n % 2 == 1) {
ansever = mutiple(ansever, x);
}
n /= 2;
x = mutiple(x, x);
}
return ansever;
}
Matrix Traspose(Matrix x) {
Matrix ansever(x.row, x.col);
for (int i = 0; i < x.row; i++) {
for (int j = 0; j < x.row; j++) {
ansever.matrix[i][j] = x.matrix[j][i];
}
}
return ansever;
}
void Inputmatrix(Matrix& x) {
for (int i = 0; i < x.row; i++) {
for (int j = 0; j < x.col; j++) {
scanf("%d", &x.matrix[i][j]);
}
}
return;
}
void Outputmatrix(Matrix x) {
for (int i = 0; i < x.row; i++) {
for (int j = 0; j < x.col; j++) {
if (j == 0)printf("%d", x.matrix[i][j]);
else printf(" %d",
x.matrix[i][j]); //每行数之间用空格隔开,注意,每行最后一个数后面不应该有多余的空格。
}
cout << endl;
}
return;
}
int main() {
int n, k;
while (cin >> n >> k) {
Matrix ansever(n, n);
Inputmatrix(ansever);
ansever = Quickpover(ansever, k);
Outputmatrix(ansever);
}
return 0;
}