#include <stdio.h>

// 行列のサイズを定義
#define M 4  // aの行数（縦）
#define N 3  // aの列数 兼 bの行数
#define K 4  // bの列数（横）

int main(void) {
    // aは 4行3列 (M x N)
    int a[M][N] = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9},
        {0, 9, 8}
    };
    
    // bは 3行4列 (N x K)
    int b[N][K] = {
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 0, 9, 8}
    };
    
    // 計算結果の sum は 4行4列 (M x K) になる
    int sum[3][K];

    // --- 行列の掛け算処理（3重ループ） ---
    for (int i = 0; i < 3; i++) {         // aの行を上から順に（4回）
        for (int j = 0; j < K; j++) {     // bの列を左から順に（4回）
            
            sum[i][j] = 0;                // 計算を始める前に中身を0にリセット
            
            for (int x = 0; x < N; x++) { // aの横移動 と bの縦移動（3回）
                sum[i][j] += a[i][x] * b[x][j];
            }
            
        }
    }

    // --- 結果の表示 ---
    printf("--- 計算結果 (4行4列) ---\n");
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < K; j++) {
            printf("%3d ", sum[i][j]); // %3d で数字の幅を綺麗に揃える
        }
        printf("\n"); // 1行表示し終わったら改行
    }

    return 0;
}