#include <iostream>
#include <vector>
using namespace std;

int sign(int a){
    if (a % 2) return -1;
    return 1;
}

int determinante(vector<vector<int> > M){
    if (M.size() == 1) return M[0][0];
    int det = 0;
    for(int i = 0; i < M.size(); i++){
        vector<vector<int> > N = M;
        N.erase(N.begin());
        for(int j = 0; j < N.size(); j++)
            N[j].erase(N[j].begin()+i);
        det += M[0][i] * determinante(N) * sign(i);
    }
    return det;
}

vector<vector<int> > reemplazo(vector<vector<int> > M, vector<int> b, int col){
    for(int i = 0; i < b.size(); i++)
        M[i][col] = b[i];
    return M;
}

int main(){
    int n;
    cout << "Bienvenido. Este programa resuelve sistemas de ecuaciones lineales compatibles\n";
    cout << "determinados que esten expresados en forma matricial Ax = b\n";
    cout << endl;
    cout << "Ingrese dimencion de la matriz (debe ser cuadrada):" << endl;
    cin >> n;
    vector<vector<int> > A(n, vector<int> (n));
    cout << "Ingrese los coeficientes: " << endl;
    for(int i = 0; i < n; i++)
        for(int j = 0; j < n; j++)
            cin >> A[i][j];
    cout << "Ingrese el vector b: " << endl;
    vector<int> b(n);
    for(int i = 0; i < n; i++)
        cin >> b[i];
    int det = determinante(A);
    if (det == 0){
        cout << "Sistema incompatible" << endl;
        return 0;
    }
    for(int i = 0; i < n; i++){
        int ndet = determinante(reemplazo(A, b, i));
        if (ndet == 0) cout << "Error handled" << endl;
        else cout << "x" << i+1 << " = " << ndet/det << endl;
    }
    return 0;
}
