import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.DecimalFormat;

/**
 * Lesson7D n×m  の行列 A  と m×l  の行列 B  を入力し、
 * それらの積である n×l  の行列 C  を出力するプログラム
 * 行列 C  の各要素 c ij   は次の式で得られます：
 * c ij =? k=1 m a ik b kj
 * ここで、A 、B 、C  の各要素をそれぞれ a ij  、b ij  、c ij   とする
 *
 * @author Internship
 *
 */
public class Main{

	/**
	 * プログラムのエントリポイント
	 *
	 * @param args
	 */
	public static void main(String[] args) {

		//行や列の各数字の一時保管場所
				int intVector = 0;

		//入力値の各行の文字列の一時保管場所
				String strLineAll = "";

		//1行目を読み込む
		try {
			BufferedReader insBR = new BufferedReader(new InputStreamReader(System.in));

			String strLine1 = insBR.readLine();

			//ばらけさせる
			String[] strAryLine1 = strLine1.split(" ");

			//１つ目がN
			int intN = Integer.parseInt(strAryLine1[0]);

			//2つ目がM
			int intM = Integer.parseInt(strAryLine1[1]);

			//3つ目がL
			int intL = Integer.parseInt(strAryLine1[2]);

			//N,M,Lが決まったところで配列の大きさが決まる
			//行列A
			int[][] intTableA = new int[intN][intM];

			//行列B
			int[][] intTableB = new int[intM][intL];

			//行列C
			double[][] dbTableC = new double[intN][intL];

			//行列Aを読み込む
			//i行目
			for(int i = 0; i < intN; i++) {
				strLineAll = insBR.readLine();

				//ばらけさせる
				String[] strAryLineAll = strLineAll.split(" ");

				//int型にキャスト
				//j列目
				for(int j = 0; j < intM; j++) {
					intVector = Integer.parseInt(strAryLineAll[j]);

					//配列に格納
					//i行のj列
					intTableA[i][j] = intVector;
				}
			}


			//行列Bを読み込む
			//i行目
			for(int i = 0; i < intM; i++) {
				strLineAll = insBR.readLine();

				//ばらけさせる
				String[] strAryLineAll = strLineAll.split(" ");

				//int型にキャスト
				//j列目
				for(int j = 0; j < intL; j++) {
					intVector = Integer.parseInt(strAryLineAll[j]);

					//配列に格納
					//i行のj列
					intTableB[i][j] = intVector;
				}
			}
			//計算
			for(int i = 0; i < intN; i++) {
				for(int j = 0; j < intL; j++) {
					for(int k = 0; k < intM; k++) {
						dbTableC[i][j] += intTableA[i][k] * intTableB[k][j];
					}

				}
			}

			//小数5桁まで
		    DecimalFormat insdf = new DecimalFormat("0");


			//出力
			for(int i = 0; i < intN; i++) {
				for(int j = 0; j < intL; j++) {
					if(j != 0) {
						System.out.print(" ");
					}
				System.out.print(insdf.format(dbTableC[i][j]));
				}
				System.out.println();
			}



		} catch (IOException e) {
			System.out.println(e);
		} catch (NumberFormatException e) {
			System.out.println("数字で入力して下さい");
		}
	}
} import java.io.BufferedReader; BufferedReader java.io import java.io.IOException; IOException java.io import java.io.InputStreamReader; InputStreamReader java.io import java.text.DecimalFormat; DecimalFormat java.text public class Main{

	/**
	 * プログラムのエントリポイント
	 *
	 * @param args
	 */
	public static void main(String[] args) {

		//行や列の各数字の一時保管場所
				int intVector = 0;

		//入力値の各行の文字列の一時保管場所
				String strLineAll = "";

		//1行目を読み込む
		try {
			BufferedReader insBR = new BufferedReader(new InputStreamReader(System.in));

			String strLine1 = insBR.readLine();

			//ばらけさせる
			String[] strAryLine1 = strLine1.split(" ");

			//１つ目がN
			int intN = Integer.parseInt(strAryLine1[0]);

			//2つ目がM
			int intM = Integer.parseInt(strAryLine1[1]);

			//3つ目がL
			int intL = Integer.parseInt(strAryLine1[2]);

			//N,M,Lが決まったところで配列の大きさが決まる
			//行列A
			int[][] intTableA = new int[intN][intM];

			//行列B
			int[][] intTableB = new int[intM][intL];

			//行列C
			double[][] dbTableC = new double[intN][intL];

			//行列Aを読み込む
			//i行目
			for(int i = 0; i < intN; i++) {
				strLineAll = insBR.readLine();

				//ばらけさせる
				String[] strAryLineAll = strLineAll.split(" ");

				//int型にキャスト
				//j列目
				for(int j = 0; j < intM; j++) {
					intVector = Integer.parseInt(strAryLineAll[j]);

					//配列に格納
					//i行のj列
					intTableA[i][j] = intVector;
				}
			}


			//行列Bを読み込む
			//i行目
			for(int i = 0; i < intM; i++) {
				strLineAll = insBR.readLine();

				//ばらけさせる
				String[] strAryLineAll = strLineAll.split(" ");

				//int型にキャスト
				//j列目
				for(int j = 0; j < intL; j++) {
					intVector = Integer.parseInt(strAryLineAll[j]);

					//配列に格納
					//i行のj列
					intTableB[i][j] = intVector;
				}
			}
			//計算
			for(int i = 0; i < intN; i++) {
				for(int j = 0; j < intL; j++) {
					for(int k = 0; k < intM; k++) {
						dbTableC[i][j] += intTableA[i][k] * intTableB[k][j];
					}

				}
			}

			//小数5桁まで
		    DecimalFormat insdf = new DecimalFormat("0");


			//出力
			for(int i = 0; i < intN; i++) {
				for(int j = 0; j < intL; j++) {
					if(j != 0) {
						System.out.print(" ");
					}
				System.out.print(insdf.format(dbTableC[i][j]));
				}
				System.out.println();
			}



		} catch (IOException e) {
			System.out.println(e);
		} catch (NumberFormatException e) {
			System.out.println("数字で入力して下さい");
		}
	}
} Main /**
	 * プログラムのエントリポイント
	 *
	 * @param args
	 */
	public static void main(String[] args) {

		//行や列の各数字の一時保管場所
				int intVector = 0;

		//入力値の各行の文字列の一時保管場所
				String strLineAll = "";

		//1行目を読み込む
		try {
			BufferedReader insBR = new BufferedReader(new InputStreamReader(System.in));

			String strLine1 = insBR.readLine();

			//ばらけさせる
			String[] strAryLine1 = strLine1.split(" ");

			//１つ目がN
			int intN = Integer.parseInt(strAryLine1[0]);

			//2つ目がM
			int intM = Integer.parseInt(strAryLine1[1]);

			//3つ目がL
			int intL = Integer.parseInt(strAryLine1[2]);

			//N,M,Lが決まったところで配列の大きさが決まる
			//行列A
			int[][] intTableA = new int[intN][intM];

			//行列B
			int[][] intTableB = new int[intM][intL];

			//行列C
			double[][] dbTableC = new double[intN][intL];

			//行列Aを読み込む
			//i行目
			for(int i = 0; i < intN; i++) {
				strLineAll = insBR.readLine();

				//ばらけさせる
				String[] strAryLineAll = strLineAll.split(" ");

				//int型にキャスト
				//j列目
				for(int j = 0; j < intM; j++) {
					intVector = Integer.parseInt(strAryLineAll[j]);

					//配列に格納
					//i行のj列
					intTableA[i][j] = intVector;
				}
			}


			//行列Bを読み込む
			//i行目
			for(int i = 0; i < intM; i++) {
				strLineAll = insBR.readLine();

				//ばらけさせる
				String[] strAryLineAll = strLineAll.split(" ");

				//int型にキャスト
				//j列目
				for(int j = 0; j < intL; j++) {
					intVector = Integer.parseInt(strAryLineAll[j]);

					//配列に格納
					//i行のj列
					intTableB[i][j] = intVector;
				}
			}
			//計算
			for(int i = 0; i < intN; i++) {
				for(int j = 0; j < intL; j++) {
					for(int k = 0; k < intM; k++) {
						dbTableC[i][j] += intTableA[i][k] * intTableB[k][j];
					}

				}
			}

			//小数5桁まで
		    DecimalFormat insdf = new DecimalFormat("0");


			//出力
			for(int i = 0; i < intN; i++) {
				for(int j = 0; j < intL; j++) {
					if(j != 0) {
						System.out.print(" ");
					}
				System.out.print(insdf.format(dbTableC[i][j]));
				}
				System.out.println();
			}



		} catch (IOException e) {
			System.out.println(e);
		} catch (NumberFormatException e) {
			System.out.println("数字で入力して下さい");
		}
	} main {

		//行や列の各数字の一時保管場所
				int intVector = 0;

		//入力値の各行の文字列の一時保管場所
				String strLineAll = "";

		//1行目を読み込む
		try {
			BufferedReader insBR = new BufferedReader(new InputStreamReader(System.in));

			String strLine1 = insBR.readLine();

			//ばらけさせる
			String[] strAryLine1 = strLine1.split(" ");

			//１つ目がN
			int intN = Integer.parseInt(strAryLine1[0]);

			//2つ目がM
			int intM = Integer.parseInt(strAryLine1[1]);

			//3つ目がL
			int intL = Integer.parseInt(strAryLine1[2]);

			//N,M,Lが決まったところで配列の大きさが決まる
			//行列A
			int[][] intTableA = new int[intN][intM];

			//行列B
			int[][] intTableB = new int[intM][intL];

			//行列C
			double[][] dbTableC = new double[intN][intL];

			//行列Aを読み込む
			//i行目
			for(int i = 0; i < intN; i++) {
				strLineAll = insBR.readLine();

				//ばらけさせる
				String[] strAryLineAll = strLineAll.split(" ");

				//int型にキャスト
				//j列目
				for(int j = 0; j < intM; j++) {
					intVector = Integer.parseInt(strAryLineAll[j]);

					//配列に格納
					//i行のj列
					intTableA[i][j] = intVector;
				}
			}


			//行列Bを読み込む
			//i行目
			for(int i = 0; i < intM; i++) {
				strLineAll = insBR.readLine();

				//ばらけさせる
				String[] strAryLineAll = strLineAll.split(" ");

				//int型にキャスト
				//j列目
				for(int j = 0; j < intL; j++) {
					intVector = Integer.parseInt(strAryLineAll[j]);

					//配列に格納
					//i行のj列
					intTableB[i][j] = intVector;
				}
			}
			//計算
			for(int i = 0; i < intN; i++) {
				for(int j = 0; j < intL; j++) {
					for(int k = 0; k < intM; k++) {
						dbTableC[i][j] += intTableA[i][k] * intTableB[k][j];
					}

				}
			}

			//小数5桁まで
		    DecimalFormat insdf = new DecimalFormat("0");


			//出力
			for(int i = 0; i < intN; i++) {
				for(int j = 0; j < intL; j++) {
					if(j != 0) {
						System.out.print(" ");
					}
				System.out.print(insdf.format(dbTableC[i][j]));
				}
				System.out.println();
			}



		} catch (IOException e) {
			System.out.println(e);
		} catch (NumberFormatException e) {
			System.out.println("数字で入力して下さい");
		}
	} int intVector = 0; intVector 0 String strLineAll = ""; strLineAll "" try {
			BufferedReader insBR = new BufferedReader(new InputStreamReader(System.in));

			String strLine1 = insBR.readLine();

			//ばらけさせる
			String[] strAryLine1 = strLine1.split(" ");

			//１つ目がN
			int intN = Integer.parseInt(strAryLine1[0]);

			//2つ目がM
			int intM = Integer.parseInt(strAryLine1[1]);

			//3つ目がL
			int intL = Integer.parseInt(strAryLine1[2]);

			//N,M,Lが決まったところで配列の大きさが決まる
			//行列A
			int[][] intTableA = new int[intN][intM];

			//行列B
			int[][] intTableB = new int[intM][intL];

			//行列C
			double[][] dbTableC = new double[intN][intL];

			//行列Aを読み込む
			//i行目
			for(int i = 0; i < intN; i++) {
				strLineAll = insBR.readLine();

				//ばらけさせる
				String[] strAryLineAll = strLineAll.split(" ");

				//int型にキャスト
				//j列目
				for(int j = 0; j < intM; j++) {
					intVector = Integer.parseInt(strAryLineAll[j]);

					//配列に格納
					//i行のj列
					intTableA[i][j] = intVector;
				}
			}


			//行列Bを読み込む
			//i行目
			for(int i = 0; i < intM; i++) {
				strLineAll = insBR.readLine();

				//ばらけさせる
				String[] strAryLineAll = strLineAll.split(" ");

				//int型にキャスト
				//j列目
				for(int j = 0; j < intL; j++) {
					intVector = Integer.parseInt(strAryLineAll[j]);

					//配列に格納
					//i行のj列
					intTableB[i][j] = intVector;
				}
			}
			//計算
			for(int i = 0; i < intN; i++) {
				for(int j = 0; j < intL; j++) {
					for(int k = 0; k < intM; k++) {
						dbTableC[i][j] += intTableA[i][k] * intTableB[k][j];
					}

				}
			}

			//小数5桁まで
		    DecimalFormat insdf = new DecimalFormat("0");


			//出力
			for(int i = 0; i < intN; i++) {
				for(int j = 0; j < intL; j++) {
					if(j != 0) {
						System.out.print(" ");
					}
				System.out.print(insdf.format(dbTableC[i][j]));
				}
				System.out.println();
			}



		} catch (IOException e) {
			System.out.println(e);
		} catch (NumberFormatException e) {
			System.out.println("数字で入力して下さい");
		} catch (IOException e) {
			System.out.println(e);
		} IOException e {
			System.out.println(e);
		} System.out.println(e) System.out.println System.out System System.out e catch (NumberFormatException e) {
			System.out.println("数字で入力して下さい");
		} NumberFormatException e {
			System.out.println("数字で入力して下さい");
		} System.out.println("数字で入力して下さい") System.out.println System.out System System.out "数字で入力して下さい" {
			BufferedReader insBR = new BufferedReader(new InputStreamReader(System.in));

			String strLine1 = insBR.readLine();

			//ばらけさせる
			String[] strAryLine1 = strLine1.split(" ");

			//１つ目がN
			int intN = Integer.parseInt(strAryLine1[0]);

			//2つ目がM
			int intM = Integer.parseInt(strAryLine1[1]);

			//3つ目がL
			int intL = Integer.parseInt(strAryLine1[2]);

			//N,M,Lが決まったところで配列の大きさが決まる
			//行列A
			int[][] intTableA = new int[intN][intM];

			//行列B
			int[][] intTableB = new int[intM][intL];

			//行列C
			double[][] dbTableC = new double[intN][intL];

			//行列Aを読み込む
			//i行目
			for(int i = 0; i < intN; i++) {
				strLineAll = insBR.readLine();

				//ばらけさせる
				String[] strAryLineAll = strLineAll.split(" ");

				//int型にキャスト
				//j列目
				for(int j = 0; j < intM; j++) {
					intVector = Integer.parseInt(strAryLineAll[j]);

					//配列に格納
					//i行のj列
					intTableA[i][j] = intVector;
				}
			}


			//行列Bを読み込む
			//i行目
			for(int i = 0; i < intM; i++) {
				strLineAll = insBR.readLine();

				//ばらけさせる
				String[] strAryLineAll = strLineAll.split(" ");

				//int型にキャスト
				//j列目
				for(int j = 0; j < intL; j++) {
					intVector = Integer.parseInt(strAryLineAll[j]);

					//配列に格納
					//i行のj列
					intTableB[i][j] = intVector;
				}
			}
			//計算
			for(int i = 0; i < intN; i++) {
				for(int j = 0; j < intL; j++) {
					for(int k = 0; k < intM; k++) {
						dbTableC[i][j] += intTableA[i][k] * intTableB[k][j];
					}

				}
			}

			//小数5桁まで
		    DecimalFormat insdf = new DecimalFormat("0");


			//出力
			for(int i = 0; i < intN; i++) {
				for(int j = 0; j < intL; j++) {
					if(j != 0) {
						System.out.print(" ");
					}
				System.out.print(insdf.format(dbTableC[i][j]));
				}
				System.out.println();
			}



		} BufferedReader insBR = new BufferedReader(new InputStreamReader(System.in)); insBR new BufferedReader(new InputStreamReader(System.in)) String strLine1 = insBR.readLine(); strLine1 insBR.readLine() insBR.readLine insBR String[] strAryLine1 = strLine1.split(" "); strAryLine1 strLine1.split(" ") strLine1.split strLine1 " " int intN = Integer.parseInt(strAryLine1[0]); intN Integer.parseInt(strAryLine1[0]) Integer.parseInt Integer strAryLine1[0] strAryLine1 0 int intM = Integer.parseInt(strAryLine1[1]); intM Integer.parseInt(strAryLine1[1]) Integer.parseInt Integer strAryLine1[1] strAryLine1 1 int intL = Integer.parseInt(strAryLine1[2]); intL Integer.parseInt(strAryLine1[2]) Integer.parseInt Integer strAryLine1[2] strAryLine1 2 int[][] intTableA = new int[intN][intM]; intTableA new int[intN][intM] intN intM int[][] intTableB = new int[intM][intL]; intTableB new int[intM][intL] intM intL double[][] dbTableC = new double[intN][intL]; dbTableC new double[intN][intL] intN intL for(int i = 0; i < intN; i++) {
				strLineAll = insBR.readLine();

				//ばらけさせる
				String[] strAryLineAll = strLineAll.split(" ");

				//int型にキャスト
				//j列目
				for(int j = 0; j < intM; j++) {
					intVector = Integer.parseInt(strAryLineAll[j]);

					//配列に格納
					//i行のj列
					intTableA[i][j] = intVector;
				}
			} int i = 0; int i = 0; i 0 i < intN i intN i++ i++ i {
				strLineAll = insBR.readLine();

				//ばらけさせる
				String[] strAryLineAll = strLineAll.split(" ");

				//int型にキャスト
				//j列目
				for(int j = 0; j < intM; j++) {
					intVector = Integer.parseInt(strAryLineAll[j]);

					//配列に格納
					//i行のj列
					intTableA[i][j] = intVector;
				}
			} {
				strLineAll = insBR.readLine();

				//ばらけさせる
				String[] strAryLineAll = strLineAll.split(" ");

				//int型にキャスト
				//j列目
				for(int j = 0; j < intM; j++) {
					intVector = Integer.parseInt(strAryLineAll[j]);

					//配列に格納
					//i行のj列
					intTableA[i][j] = intVector;
				}
			} strLineAll = insBR.readLine() strLineAll insBR.readLine() insBR.readLine insBR String[] strAryLineAll = strLineAll.split(" "); strAryLineAll strLineAll.split(" ") strLineAll.split strLineAll " " for(int j = 0; j < intM; j++) {
					intVector = Integer.parseInt(strAryLineAll[j]);

					//配列に格納
					//i行のj列
					intTableA[i][j] = intVector;
				} int j = 0; int j = 0; j 0 j < intM j intM j++ j++ j {
					intVector = Integer.parseInt(strAryLineAll[j]);

					//配列に格納
					//i行のj列
					intTableA[i][j] = intVector;
				} {
					intVector = Integer.parseInt(strAryLineAll[j]);

					//配列に格納
					//i行のj列
					intTableA[i][j] = intVector;
				} intVector = Integer.parseInt(strAryLineAll[j]) intVector Integer.parseInt(strAryLineAll[j]) Integer.parseInt Integer strAryLineAll[j] strAryLineAll j intTableA[i][j] = intVector intTableA[i][j] intTableA[i] intTableA i j intVector for(int i = 0; i < intM; i++) {
				strLineAll = insBR.readLine();

				//ばらけさせる
				String[] strAryLineAll = strLineAll.split(" ");

				//int型にキャスト
				//j列目
				for(int j = 0; j < intL; j++) {
					intVector = Integer.parseInt(strAryLineAll[j]);

					//配列に格納
					//i行のj列
					intTableB[i][j] = intVector;
				}
			} int i = 0; int i = 0; i 0 i < intM i intM i++ i++ i {
				strLineAll = insBR.readLine();

				//ばらけさせる
				String[] strAryLineAll = strLineAll.split(" ");

				//int型にキャスト
				//j列目
				for(int j = 0; j < intL; j++) {
					intVector = Integer.parseInt(strAryLineAll[j]);

					//配列に格納
					//i行のj列
					intTableB[i][j] = intVector;
				}
			} {
				strLineAll = insBR.readLine();

				//ばらけさせる
				String[] strAryLineAll = strLineAll.split(" ");

				//int型にキャスト
				//j列目
				for(int j = 0; j < intL; j++) {
					intVector = Integer.parseInt(strAryLineAll[j]);

					//配列に格納
					//i行のj列
					intTableB[i][j] = intVector;
				}
			} strLineAll = insBR.readLine() strLineAll insBR.readLine() insBR.readLine insBR String[] strAryLineAll = strLineAll.split(" "); strAryLineAll strLineAll.split(" ") strLineAll.split strLineAll " " for(int j = 0; j < intL; j++) {
					intVector = Integer.parseInt(strAryLineAll[j]);

					//配列に格納
					//i行のj列
					intTableB[i][j] = intVector;
				} int j = 0; int j = 0; j 0 j < intL j intL j++ j++ j {
					intVector = Integer.parseInt(strAryLineAll[j]);

					//配列に格納
					//i行のj列
					intTableB[i][j] = intVector;
				} {
					intVector = Integer.parseInt(strAryLineAll[j]);

					//配列に格納
					//i行のj列
					intTableB[i][j] = intVector;
				} intVector = Integer.parseInt(strAryLineAll[j]) intVector Integer.parseInt(strAryLineAll[j]) Integer.parseInt Integer strAryLineAll[j] strAryLineAll j intTableB[i][j] = intVector intTableB[i][j] intTableB[i] intTableB i j intVector for(int i = 0; i < intN; i++) {
				for(int j = 0; j < intL; j++) {
					for(int k = 0; k < intM; k++) {
						dbTableC[i][j] += intTableA[i][k] * intTableB[k][j];
					}

				}
			} int i = 0; int i = 0; i 0 i < intN i intN i++ i++ i {
				for(int j = 0; j < intL; j++) {
					for(int k = 0; k < intM; k++) {
						dbTableC[i][j] += intTableA[i][k] * intTableB[k][j];
					}

				}
			} {
				for(int j = 0; j < intL; j++) {
					for(int k = 0; k < intM; k++) {
						dbTableC[i][j] += intTableA[i][k] * intTableB[k][j];
					}

				}
			} for(int j = 0; j < intL; j++) {
					for(int k = 0; k < intM; k++) {
						dbTableC[i][j] += intTableA[i][k] * intTableB[k][j];
					}

				} int j = 0; int j = 0; j 0 j < intL j intL j++ j++ j {
					for(int k = 0; k < intM; k++) {
						dbTableC[i][j] += intTableA[i][k] * intTableB[k][j];
					}

				} {
					for(int k = 0; k < intM; k++) {
						dbTableC[i][j] += intTableA[i][k] * intTableB[k][j];
					}

				} for(int k = 0; k < intM; k++) {
						dbTableC[i][j] += intTableA[i][k] * intTableB[k][j];
					} int k = 0; int k = 0; k 0 k < intM k intM k++ k++ k {
						dbTableC[i][j] += intTableA[i][k] * intTableB[k][j];
					} {
						dbTableC[i][j] += intTableA[i][k] * intTableB[k][j];
					} dbTableC[i][j] += intTableA[i][k] * intTableB[k][j] dbTableC[i][j] dbTableC[i] dbTableC i j intTableA[i][k] * intTableB[k][j] intTableA[i][k] intTableA[i] intTableA i k intTableB[k][j] intTableB[k] intTableB k j DecimalFormat insdf = new DecimalFormat("0"); insdf new DecimalFormat("0") for(int i = 0; i < intN; i++) {
				for(int j = 0; j < intL; j++) {
					if(j != 0) {
						System.out.print(" ");
					}
				System.out.print(insdf.format(dbTableC[i][j]));
				}
				System.out.println();
			} int i = 0; int i = 0; i 0 i < intN i intN i++ i++ i {
				for(int j = 0; j < intL; j++) {
					if(j != 0) {
						System.out.print(" ");
					}
				System.out.print(insdf.format(dbTableC[i][j]));
				}
				System.out.println();
			} {
				for(int j = 0; j < intL; j++) {
					if(j != 0) {
						System.out.print(" ");
					}
				System.out.print(insdf.format(dbTableC[i][j]));
				}
				System.out.println();
			} for(int j = 0; j < intL; j++) {
					if(j != 0) {
						System.out.print(" ");
					}
				System.out.print(insdf.format(dbTableC[i][j]));
				} int j = 0; int j = 0; j 0 j < intL j intL j++ j++ j {
					if(j != 0) {
						System.out.print(" ");
					}
				System.out.print(insdf.format(dbTableC[i][j]));
				} {
					if(j != 0) {
						System.out.print(" ");
					}
				System.out.print(insdf.format(dbTableC[i][j]));
				} if(j != 0) {
						System.out.print(" ");
					} j != 0 j 0 {
						System.out.print(" ");
					} System.out.print(" ") System.out.print System.out System System.out " " System.out.print(insdf.format(dbTableC[i][j])) System.out.print System.out System System.out insdf.format(dbTableC[i][j]) insdf.format insdf dbTableC[i][j] dbTableC[i] dbTableC i j System.out.println() System.out.println System.out System System.out String[] args args public class Main{

	/**
	 * プログラムのエントリポイント
	 *
	 * @param args
	 */
	public static void main(String[] args) {

		//行や列の各数字の一時保管場所
				int intVector = 0;

		//入力値の各行の文字列の一時保管場所
				String strLineAll = "";

		//1行目を読み込む
		try {
			BufferedReader insBR = new BufferedReader(new InputStreamReader(System.in));

			String strLine1 = insBR.readLine();

			//ばらけさせる
			String[] strAryLine1 = strLine1.split(" ");

			//１つ目がN
			int intN = Integer.parseInt(strAryLine1[0]);

			//2つ目がM
			int intM = Integer.parseInt(strAryLine1[1]);

			//3つ目がL
			int intL = Integer.parseInt(strAryLine1[2]);

			//N,M,Lが決まったところで配列の大きさが決まる
			//行列A
			int[][] intTableA = new int[intN][intM];

			//行列B
			int[][] intTableB = new int[intM][intL];

			//行列C
			double[][] dbTableC = new double[intN][intL];

			//行列Aを読み込む
			//i行目
			for(int i = 0; i < intN; i++) {
				strLineAll = insBR.readLine();

				//ばらけさせる
				String[] strAryLineAll = strLineAll.split(" ");

				//int型にキャスト
				//j列目
				for(int j = 0; j < intM; j++) {
					intVector = Integer.parseInt(strAryLineAll[j]);

					//配列に格納
					//i行のj列
					intTableA[i][j] = intVector;
				}
			}


			//行列Bを読み込む
			//i行目
			for(int i = 0; i < intM; i++) {
				strLineAll = insBR.readLine();

				//ばらけさせる
				String[] strAryLineAll = strLineAll.split(" ");

				//int型にキャスト
				//j列目
				for(int j = 0; j < intL; j++) {
					intVector = Integer.parseInt(strAryLineAll[j]);

					//配列に格納
					//i行のj列
					intTableB[i][j] = intVector;
				}
			}
			//計算
			for(int i = 0; i < intN; i++) {
				for(int j = 0; j < intL; j++) {
					for(int k = 0; k < intM; k++) {
						dbTableC[i][j] += intTableA[i][k] * intTableB[k][j];
					}

				}
			}

			//小数5桁まで
		    DecimalFormat insdf = new DecimalFormat("0");


			//出力
			for(int i = 0; i < intN; i++) {
				for(int j = 0; j < intL; j++) {
					if(j != 0) {
						System.out.print(" ");
					}
				System.out.print(insdf.format(dbTableC[i][j]));
				}
				System.out.println();
			}



		} catch (IOException e) {
			System.out.println(e);
		} catch (NumberFormatException e) {
			System.out.println("数字で入力して下さい");
		}
	}
} public class Main{

	/**
	 * プログラムのエントリポイント
	 *
	 * @param args
	 */
	public static void main(String[] args) {

		//行や列の各数字の一時保管場所
				int intVector = 0;

		//入力値の各行の文字列の一時保管場所
				String strLineAll = "";

		//1行目を読み込む
		try {
			BufferedReader insBR = new BufferedReader(new InputStreamReader(System.in));

			String strLine1 = insBR.readLine();

			//ばらけさせる
			String[] strAryLine1 = strLine1.split(" ");

			//１つ目がN
			int intN = Integer.parseInt(strAryLine1[0]);

			//2つ目がM
			int intM = Integer.parseInt(strAryLine1[1]);

			//3つ目がL
			int intL = Integer.parseInt(strAryLine1[2]);

			//N,M,Lが決まったところで配列の大きさが決まる
			//行列A
			int[][] intTableA = new int[intN][intM];

			//行列B
			int[][] intTableB = new int[intM][intL];

			//行列C
			double[][] dbTableC = new double[intN][intL];

			//行列Aを読み込む
			//i行目
			for(int i = 0; i < intN; i++) {
				strLineAll = insBR.readLine();

				//ばらけさせる
				String[] strAryLineAll = strLineAll.split(" ");

				//int型にキャスト
				//j列目
				for(int j = 0; j < intM; j++) {
					intVector = Integer.parseInt(strAryLineAll[j]);

					//配列に格納
					//i行のj列
					intTableA[i][j] = intVector;
				}
			}


			//行列Bを読み込む
			//i行目
			for(int i = 0; i < intM; i++) {
				strLineAll = insBR.readLine();

				//ばらけさせる
				String[] strAryLineAll = strLineAll.split(" ");

				//int型にキャスト
				//j列目
				for(int j = 0; j < intL; j++) {
					intVector = Integer.parseInt(strAryLineAll[j]);

					//配列に格納
					//i行のj列
					intTableB[i][j] = intVector;
				}
			}
			//計算
			for(int i = 0; i < intN; i++) {
				for(int j = 0; j < intL; j++) {
					for(int k = 0; k < intM; k++) {
						dbTableC[i][j] += intTableA[i][k] * intTableB[k][j];
					}

				}
			}

			//小数5桁まで
		    DecimalFormat insdf = new DecimalFormat("0");


			//出力
			for(int i = 0; i < intN; i++) {
				for(int j = 0; j < intL; j++) {
					if(j != 0) {
						System.out.print(" ");
					}
				System.out.print(insdf.format(dbTableC[i][j]));
				}
				System.out.println();
			}



		} catch (IOException e) {
			System.out.println(e);
		} catch (NumberFormatException e) {
			System.out.println("数字で入力して下さい");
		}
	}
} Main
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.DecimalFormat;

/**
 * Lesson7D n×m  の行列 A  と m×l  の行列 B  を入力し、
 * それらの積である n×l  の行列 C  を出力するプログラム
 * 行列 C  の各要素 c ij   は次の式で得られます：
 * c ij =? k=1 m a ik b kj
 * ここで、A 、B 、C  の各要素をそれぞれ a ij  、b ij  、c ij   とする
 *
 * @author Internship
 *
 */
public class Main{

	/**
	 * プログラムのエントリポイント
	 *
	 * @param args
	 */
	public static void main(String[] args) {

		//行や列の各数字の一時保管場所
				int intVector = 0;

		//入力値の各行の文字列の一時保管場所
				String strLineAll = "";

		//1行目を読み込む
		try {
			BufferedReader insBR = new BufferedReader(new InputStreamReader(System.in));

			String strLine1 = insBR.readLine();

			//ばらけさせる
			String[] strAryLine1 = strLine1.split(" ");

			//１つ目がN
			int intN = Integer.parseInt(strAryLine1[0]);

			//2つ目がM
			int intM = Integer.parseInt(strAryLine1[1]);

			//3つ目がL
			int intL = Integer.parseInt(strAryLine1[2]);

			//N,M,Lが決まったところで配列の大きさが決まる
			//行列A
			int[][] intTableA = new int[intN][intM];

			//行列B
			int[][] intTableB = new int[intM][intL];

			//行列C
			double[][] dbTableC = new double[intN][intL];

			//行列Aを読み込む
			//i行目
			for(int i = 0; i < intN; i++) {
				strLineAll = insBR.readLine();

				//ばらけさせる
				String[] strAryLineAll = strLineAll.split(" ");

				//int型にキャスト
				//j列目
				for(int j = 0; j < intM; j++) {
					intVector = Integer.parseInt(strAryLineAll[j]);

					//配列に格納
					//i行のj列
					intTableA[i][j] = intVector;
				}
			}


			//行列Bを読み込む
			//i行目
			for(int i = 0; i < intM; i++) {
				strLineAll = insBR.readLine();

				//ばらけさせる
				String[] strAryLineAll = strLineAll.split(" ");

				//int型にキャスト
				//j列目
				for(int j = 0; j < intL; j++) {
					intVector = Integer.parseInt(strAryLineAll[j]);

					//配列に格納
					//i行のj列
					intTableB[i][j] = intVector;
				}
			}
			//計算
			for(int i = 0; i < intN; i++) {
				for(int j = 0; j < intL; j++) {
					for(int k = 0; k < intM; k++) {
						dbTableC[i][j] += intTableA[i][k] * intTableB[k][j];
					}

				}
			}

			//小数5桁まで
		    DecimalFormat insdf = new DecimalFormat("0");


			//出力
			for(int i = 0; i < intN; i++) {
				for(int j = 0; j < intL; j++) {
					if(j != 0) {
						System.out.print(" ");
					}
				System.out.print(insdf.format(dbTableC[i][j]));
				}
				System.out.println();
			}



		} catch (IOException e) {
			System.out.println(e);
		} catch (NumberFormatException e) {
			System.out.println("数字で入力して下さい");
		}
	}
}