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# (judge verdict: Accepted)

using System;
using System.Collections.Generic;
using System.Linq;

namespace AtCoder
{
	class Program
	{
		static void Main(string[] args)
		{
			var Instance = new Question();
			Instance.Exec();
		}
	}

	public class Question
	{
		public void Exec()
		{
			var nml = Console.ReadLine().Split(' ').Select(i => int.Parse(i)).ToArray();
			int n = nml[0];
			int m = nml[1];
			int l = nml[2];
			int[,] A = new int[n, m];
			for (int j = 0; j < n; ++j) {
				var aij = Console.ReadLine().Split(' ').Select(i => int.Parse(i)).ToArray();
				for (int k = 0; k < aij.Length; ++k) {
					A[j, k] = aij[k];
				}
			}

			int[,] B = new int[m, l];
			for (int j = 0; j < m; ++j) {
				var bij = Console.ReadLine().Split(' ').Select(i => int.Parse(i)).ToArray();
				for (int k = 0; k < bij.Length; ++k) {
					B[j, k] = bij[k];
				}
			}

			long[,] C = new long[n, l];
			for (int j = 0; j < C.GetLength(0); ++j) {
				for (int k = 0; k < C.GetLength(1); ++k) {
					for (int i = 0; i < m; ++i) {
						C[j, k] += (long)A[j, i] * (long)B[i, k];
					}
				}
			}

			for (int j = 0; j < C.GetLength(0); ++j) {
				for (int k = 0; k < C.GetLength(1); ++k) {
					Console.Write($"{C[j, k]}");
					if (k < C.GetLength(1) - 1) {
						Console.Write(" ");
					}
				}
				Console.WriteLine("");
			}

			Console.ReadKey();
		}
	}
}