Problem:
MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }});

Matrix Multiplication

Write a program which reads a $n \times m$ matrix $A$ and a $m \times l$ matrix $B$, and prints their product, a $n \times l$ matrix $C$. An element of matrix $C$ is obtained by the following formula:

\[
c_{ij} = \sum_{k=1}^m a_{ik}b_{kj}
\]

where $a_{ij}$, $b_{ij}$ and $c_{ij}$ are elements of $A$, $B$ and $C$ respectively.

Input

In the first line, three integers $n$, $m$ and $l$ are given separated by space characters

In the following lines, the $n \times m$ matrix $A$ and the $m \times l$ matrix $B$ are given.

Output

Print elements of the $n \times l$ matrix $C$ ($c_{ij}$). Print a single space character between adjacent elements.

Constraints

$1 \leq n, m, l \leq 100$

$0 \leq a_{ij}, b_{ij} \leq 10000$

Sample Input

3 2 3
1 2
0 3
4 5
1 2 1
0 3 2

Sample Output

1 8 5
0 9 6
4 23 14

Note

      解説

Solution in C++14 (judge verdict: Accepted)

#include<iostream>
#include<vector>
using namespace std;

typedef unsigned long long ULL;

int main()
{
	ULL N, M, L;
	cin >> N >> M >> L;
	
	vector<vector<ULL>> matrix(N, vector<ULL>(M));
	for(auto it = matrix.begin(); it != matrix.end(); it++)
	{
		for(auto itx = it->begin(); itx != it->end(); itx++)
		{
			cin >> *itx;
		}
	}
	
	vector<vector<ULL>> matrix_B(M, vector<ULL>(L));
	for(auto it = matrix_B.begin(); it != matrix_B.end(); it++)
	{
		for(auto itx = it->begin(); itx != it->end(); itx++)
		{
			cin >> *itx;
		}
	}
	
	for(int i = 0; i < N; i++)
	{
		for(int j = 0; j < L; j++)
		{
			ULL ans = 0;
			
			for(int k = 0; k < M; k++)
			{
				ans += matrix[i][k] * matrix_B[k][j];
			}
			
			cout << ans;
			if(j + 1 != L)cout << " ";
		}
		cout << endl;
	}
	
	return 0;
}