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 JAVA (judge verdict: Wrong Answer)

//????????????
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

//?????????????????????MaxValueException
class MaxValueException extends Exception{

}

//???????????????
class Matrix{



	public int[][] arrayA;
	public int[][] arrayB;
	public int[][] arrayC;


	public Matrix() { }

	// ????????????
	public void CreateArray(String str) throws MaxValueException{

		String[] strArray = str.split(" ");
		int a = Integer.parseInt(strArray[0]);				//??????A????????°rowA
		int b = Integer.parseInt(strArray[1]);				//??????A????????°??¨??????B????????°colA
		int c = Integer.parseInt(strArray[2]);				//??????B????????°colB

		if((1 <= a && a <= 100) && (1 <= b && b <= 100) && (1 <= c && c <= 100)) {
			this.arrayA = new int[a][b];
			this.arrayB = new int[b][c];
			this.arrayC = new int[a][c];
		}
		else {
			throw new MaxValueException();
		}
	}

	// ?????????????¨????
	public void SetValue(int i, int j, String value, boolean chk) throws MaxValueException{

		int num = Integer.parseInt(value);
		if(0 <= num && num <= 10000) {
			if(chk) {
				this.arrayA[i][j] = num;
			}else {
				this.arrayB[i][j] = num;
			}

		}else {
			throw new MaxValueException();
		}
	}

	// ?¨????
	public void SetMatrix() throws MaxValueException{
		//??????A??¨??????B?????????????´?????????????C
		
		for(int i=0; i< this.arrayA.length; i++) {
			for(int j=0; j<this.arrayA[i].length; j++) {
				for(int k=0; k<this.arrayB[j].length; k++) {
					this.arrayC[i][k] = this.arrayC[i][k] + this.arrayA[i][j] * this.arrayB[j][k];
				}				
			}
		}
	}

	// ??¨???
	public void Show()
	{
		for(int i=0; i<this.arrayC.length;i++) {
			for(int j=0; j<this.arrayC[i].length;j++) {
			if(j==(this.arrayC[i].length)-1) {
				System.out.print(this.arrayC[i][j]);
			}
			else
				System.out.print(this.arrayC[i][j]+" ");
			}
			System.out.print("\n");
		}
	}
}

class Main{
	public static void main(String[] args)throws IOException{
		BufferedReader br =
				new BufferedReader(new InputStreamReader(System.in));

		//matrix????????????C???????????§???????????????
		Matrix c = new Matrix();

		//????????????setmatrix?????????A??¨??????B???????????¨??°????????\?????¶?´??????????
		try {

			c.CreateArray(br.readLine());


			//??????A???????´?????????? arrayA
			for(int i=0; i<c.arrayA.length;i++) {
				String[] arrayStrA = br.readLine().split(" ");

				for(int j=0; j<c.arrayA[i].length; j++) {
					c.SetValue(i, j, arrayStrA[j], true);
				}
			}

			//??????B???????´??????????arrayB
			for(int i=0; i<c.arrayB.length ;i++) {
				String[] arrayStrB = br.readLine().split(" ");
				for(int j=0; j<c.arrayB[i].length; j++) {
					c.SetValue(i, j, arrayStrB[j], false);
				}
			}

			// ?¨????
			c.SetMatrix();
		}
		catch(MaxValueException e) {
			System.out.println(e + "???????????????????????????");
		}

		//????????????
		c.Show();
	}

}