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;

namespace ITP1_1_A
{
    class Program
    {
        static private List<int> matrixA = new List<int>();
        static private List<int> matrixB = new List<int>();
        static private List<long> matrixC = new List<long>();
        static private int input_A_Row;
        static private int input_A_Column;
        static private int input_B_Row;
        static private int input_B_Column;

        static void Main(string[] args)
        {
            InputInforMatrix();
            InputMatrix(input_A_Row, input_A_Column, matrixA);
            InputMatrix(input_B_Row, input_B_Column, matrixB);
            CalculateMatrix(input_A_Row, input_A_Column, matrixA, input_B_Row, input_B_Column, matrixB, matrixC);
            OutputMatrix(matrixC, input_A_Row, input_B_Column);
        }

        static void InputInforMatrix()
        {
            string[] num = Console.ReadLine().Split();
            input_A_Row = int.Parse(num[0]);
            input_A_Column = int.Parse(num[1]);
            input_B_Row = int.Parse(num[1]);//input_B_Row=input_A_Column
            input_B_Column = int.Parse(num[2]);
        }

        static void InputMatrix(int row, int column, List<int> matrix)
        {
            for (int i = 0; i < row; i++)
            {
                string[] num = Console.ReadLine().Split();
                for (int j = 0; j < column; j++)
                {
                    matrix.Add(int.Parse(num[j]));
                }
            }
        }
        static void CalculateMatrix(int firstMatrixRow, int firstMatrixColumn, List<int> firstMatrix, int secondMatrixRow, int secondMatrixColumn, List<int> secondMatrix, List<long> answerMatrix)
        {
            if (firstMatrixColumn != secondMatrixRow) return;
            for (int iniA = 0; iniA < firstMatrixRow * firstMatrixColumn; iniA += firstMatrixColumn)
            {
                for (int iniB = 0; iniB < secondMatrixColumn; iniB++)
                {
                    long sum = 0;
                    for (int i = 0; i < input_A_Column; i++)
                    {
                        sum += firstMatrix[iniA + i] * secondMatrix[i * secondMatrixColumn + iniB];
                    }
                    answerMatrix.Add(sum);
                }
            }
        }
        static void OutputMatrix(List<long> matrix, int row, int column)
        {
            for (int i = 0; i < row * column; i++)
            {
                Console.Write(matrix[i]);
                if (i % column == column - 1)
                {
                    Console.WriteLine();
                }
                else
                {
                    Console.Write(" ");
                }
            }
        }
    }
}