#include<iostream>


using namespace std;



const int MAXN = 100;
//定义矩阵结构体
//实际上一个矩阵就是一个二维的数组
struct Matrix {
	int matrix[MAXN][MAXN];
	int row;    //行数
	int column;   //列数
	Matrix() {}
	Matrix(int r, int c) : row(r),column(c) {}
};

//矩阵乘法
Matrix Multiply(Matrix x,Matrix y) {
	//合法性判断
	if(x.column != y.row) {
		printf("Illegal input");
	}
	Matrix answer = Matrix(x.row,y.column);
	for(int i = 0; i < answer.row; ++i) {
		for(int j = 0; j < answer.column; ++j) {
			answer.matrix[i][j] = 0;   //累加器
			for(int k = 0; k < x.column; ++k) {
				answer.matrix[i][j] += x.matrix[i][k] * y.matrix[k][j];;
			}
		}
	}
	return answer;
}



//定义输入矩阵方法
void InputMatrix(Matrix& x) {
	//初始化矩阵
	for(int i = 0; i < x.row; ++i) {
		for(int j = 0; j < x.column; ++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.column; ++j) {
			printf("%d ",x.matrix[i][j]);
		}
		printf("\n");
	}
	return ;
}

int main() {
	//定义两个进行运算的矩阵
	Matrix x(2,3);
	Matrix y(3,2);
	InputMatrix(x);
	InputMatrix(y);
	Matrix answer = Multiply(x,y);
	
	OutputMatrix(answer);
	return 0;
}