//Inverse Solve
#include <stdio.h>
#include <math.h>

void get_cofactor(float A[10][10], float temp[10][10], int p, int q, int n) {
    int i = 0, j = 0;
    for (int row = 0; row < n; row++) {
        for (int col = 0; col < n; col++) {
            if (row != p && col != q) {
                temp[i][j++] = A[row][col];
                if (j == n - 1) {
                    j = 0;
                    i++;
                }
            }
        }
    }
}

float determinant(float A[10][10], int n) {
    float D = 0;
    if (n == 1) return A[0][0];

    float temp[10][10];
    int sign = 1;

    for (int f = 0; f < n; f++) {
        get_cofactor(A, temp, 0, f, n);
        D += sign * A[0][f] * determinant(temp, n - 1);
        sign = -sign;
    }
    return D;
}

void adjoint(float A[10][10], float adj[10][10], int n) {
    if (n == 1) {
        adj[0][0] = 1;
        return;
    }

    float temp[10][10];
    int sign;

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            get_cofactor(A, temp, i, j, n);
            sign = ((i + j) % 2 == 0) ? 1 : -1;
            adj[j][i] = sign * determinant(temp, n - 1);
        }
    }
}

void inverse(float A[10][10], float inverseA[10][10], int n) {
    float det = determinant(A, n);
    if (fabs(det) < 1e-9) {
        printf("Singular Matrix: Inverse does not exist.\n");
        return;
    }

    float adj[10][10];
    adjoint(A, adj, n);

    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            inverseA[i][j] = adj[i][j] / det;
}

int main() {
    int n;
    float A[10][10], InvA[10][10];

    printf("Enter the size of the square matrix (N): ");
    scanf("%d", &n);

    if (n > 10 || n < 1) return 1;

    printf("Enter elements of the matrix:\n");
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            scanf("%f", &A[i][j]);

    float det = determinant(A, n);
    if (fabs(det) < 1e-9) {
        printf("\nInverse does not exist (Determinant is zero).\n");
        return 0;
    }

    inverse(A, InvA, n);

    printf("\nInverse Matrix:\n");
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++)
            printf("%.4f\t", InvA[i][j]);
        printf("\n");
    }

    return 0;
}

//det
#include <stdio.h>

#define N 3 // We fix the size to 3x3

// Function to get the sub-matrix by hiding row 'p' and col 'q'
void get_cofactor(float A[N][N], float temp[N][N], int p, int q, int n) {
    int i = 0, j = 0;
    for (int row = 0; row < n; row++) {
        for (int col = 0; col < n; col++) {
            // Copy element only if it is NOT in the hidden row/col
            if (row != p && col != q) {
                temp[i][j++] = A[row][col];
                // If row is full, move to next row
                if (j == n - 1) {
                    j = 0;
                    i++;
                }
            }
        }
    }
}

// Recursive function to find determinant
float determinant(float A[N][N], int n) {
    float D = 0;
    // Base case: if matrix is 1x1, the det is the number itself
    if (n == 1) return A[0][0];

    float temp[N][N]; // To store sub-matrix
    int sign = 1;     // To handle + - + sign pattern

    for (int f = 0; f < n; f++) {
        get_cofactor(A, temp, 0, f, n); // Hide row 0, col f
        D += sign * A[0][f] * determinant(temp, n - 1);
        sign = -sign; // Flip sign
    }
    return D;
}

int main() {
    float A[N][N];
    
    printf("Enter 3x3 Matrix elements:\n");
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            scanf("%f", &A[i][j]);
        }
    }

    // We pass 'N' (which is 3) to the function
    printf("Determinant: %.2f\n", determinant(A, N));

    return 0;
}

//Inv
#include <stdio.h>
#include <math.h> // For fabs()

#define N 3 // Fixed to 3x3

void get_cofactor(float A[N][N], float temp[N][N], int p, int q, int n) {
    int i = 0, j = 0;
    for (int row = 0; row < n; row++) {
        for (int col = 0; col < n; col++) {
            if (row != p && col != q) {
                temp[i][j++] = A[row][col];
                if (j == n - 1) {
                    j = 0;
                    i++;
                }
            }
        }
    }
}

float determinant(float A[N][N], int n) {
    float D = 0;
    if (n == 1) return A[0][0];

    float temp[N][N];
    int sign = 1;

    for (int f = 0; f < n; f++) {
        get_cofactor(A, temp, 0, f, n);
        D += sign * A[0][f] * determinant(temp, n - 1);
        sign = -sign;
    }
    return D;
}

// Function to calculate Adjoint
void adjoint(float A[N][N], float adj[N][N], int n) {
    if (n == 1) {
        adj[0][0] = 1;
        return;
    }

    float temp[N][N];
    int sign = 1;

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            // Get sub-matrix for A[i][j]
            get_cofactor(A, temp, i, j, n);
            
            // Determine sign: positive if sum of indices is even
            sign = ((i + j) % 2 == 0) ? 1 : -1;
            
            // IMPORTANT: Assign to adj[j][i] (transpose happens here)
            adj[j][i] = sign * determinant(temp, n - 1);
        }
    }
}

// Function to calculate Inverse
void inverse(float A[N][N], float inv[N][N], int n) {
    float det = determinant(A, n);
    
    if (fabs(det) < 0.00001) {
        printf("Inverse impossible (Determinant is 0)\n");
        return;
    }

    float adj[N][N];
    adjoint(A, adj, n);

    // Inverse = Adjoint / Determinant
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            inv[i][j] = adj[i][j] / det;
}

int main() {
    float A[N][N], InvA[N][N];

    printf("Enter 3x3 Matrix elements:\n");
    for (int i = 0; i < N; i++)
        for (int j = 0; j < N; j++)
            scanf("%f", &A[i][j]);

    // Calculate Inverse
    inverse(A, InvA, N);

    // Check if determinant was non-zero before printing
    if (fabs(determinant(A, N)) >= 0.00001) {
        printf("\nInverse Matrix:\n");
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++)
                printf("%.2f\t", InvA[i][j]);
            printf("\n");
        }
    }

    return 0;
}