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

module Main where
--import Debug.Trace
import Data.List
import Data.Array
import Data.Maybe
import Data.Ord
import Control.Monad

solve :: [Int]-> [[Int]] -> [[Int]] -> [[Int]]
solve [n, m, l] anm bml = iterR 0 where
    iterR r
        | r >= n    = []
        | otherwise = iterC 0 : iterR (r+1) where
            iterC c
                | c >= l = []
                | otherwise = prod 0 : iterC (c+1) where
                    prod x
                        | x >= m = 0
                        | otherwise = aij ! (r, x) * bij ! (x, c) + prod (x+1)
    aij = listArray ((0,0),(n-1,m-1)) (concat anm)
    bij = listArray ((0,0),(m-1,l-1)) (concat bml)

readLine:: IO [Int]
readLine = fmap (map read . words) getLine

readUntil :: ([Int] -> Bool) -> IO [[Int]]
readUntil eof = iter where
    iter = readLine >>=
            (\a -> if eof a then return [] else fmap (a:) iter)

readLines :: Int -> IO [[Int]]
readLines 0 = return []
readLines n = readLine >>= (\a -> fmap (a:) (readLines (pred n)))
            
eof :: [Int] -> Bool
eof (x0:x1:xs) = all (==0) [x0, x1]

main :: IO() 
main = do
    [n, m, l] <- readLine
    anm  <- readLines n
    bml  <- readLines m
    mapM_ putStrLn $ map (\y -> init (concatMap (\x-> show x ++ " ") y)) (solve [n, m, l] anm bml)