#include <stdio.h>

#define SIZE 5

// 行列の掛け算を行う関数 (R = M1 * M2)
void multiply_matrices(double m1[SIZE][SIZE], double m2[SIZE][SIZE], double r[SIZE][SIZE]) {
    // 結果を格納する配列を一度0で初期化
    for (int i = 0; i < SIZE; i++) {
        for (int j = 0; j < SIZE; j++) {
            r[i][j] = 0;
        }
    }

    // 行列の積の定義に基づいて計算
    for (int i = 0; i < SIZE; i++) {
        for (int j = 0; j < SIZE; j++) {
            for (int k = 0; k < SIZE; k++) {
                r[i][j] += m1[i][k] * m2[k][j];
            }
        }
    }
}

// 行列を表示する関数
void print_matrix(double m[SIZE][SIZE]) {
    for (int i = 0; i < SIZE; i++) {
        for (int j = 0; j < SIZE; j++) {
            // 小数点以下をきれいに揃えて表示
            printf("%6.0f\t", m[i][j]);
        }
        printf("\n");
    }
}

int main() {
    // 1. 初期行列 A の定義
    double A[SIZE][SIZE] = {
        {10, -2,  0,  0,  0},
        {-2,  9, -1,  0,  0},
        { 0, -1,  8, -2,  0},
        { 0,  0, -2,  7, -1},
        { 0,  0,  0, -1,  5}
    };

    double A2[SIZE][SIZE]; // A^2 を格納する配列
    double A3[SIZE][SIZE]; // A^3 を格納する配列

    // 2. A^2 = A * A を計算
    multiply_matrices(A, A, A2);

    // 3. A^3 = A^2 * A を計算
    multiply_matrices(A2, A, A3);

    // 4. 結果の表示
    printf("--- 行列 A^2 の結果 ---\n");
    print_matrix(A2);

    printf("\n--- 行列 A^3 の結果 ---\n");
    print_matrix(A3);

    return 0;
}