#include<bits/stdc++.h>
using namespace std;
//#include "algo/debug.h"
int N;
void gj(vector<vector<double>> A) {
// Gauss-Jordan Elimination
for (int k = 0; k < N; k++) {
// Partial Pivoting
int maxRow = k;
for (int i = k + 1; i < N; i++) {
if (abs(A[i][k]) > abs(A[maxRow][k])) {
maxRow = i;
}
}
if (maxRow != k) {
swap(A[k], A[maxRow]);
}
// Make diagonal element 1
double diag = A[k][k];
for (int j = 0; j <= N; j++) {
A[k][j] /= diag;
}
// Make other elements in column 0
for (int i = 0; i < N; i++) {
if (i != k) {
double r = A[i][k];
for (int j = 0; j <= N; j++) {
A[i][j] -= r * A[k][j];
}
}
}
}
// Display solutions
cout << "Solution:\n";
for (int i = 0; i < N; i++) {
cout << "x" << i+1 << ": " << A[i][N] << endl;
}
}
signed main() {
//freopen("Error.txt", "w", stderr);
cout << "Enter N: \n";
cin >> N;
vector<vector<double>> A(N, vector<double>(N+1, 0));
cout << "Enter: \n";
for (int i = 0; i<N; i++) {
for (int j = 0; j <= N; j++) {
cin >> A[i][j];
}
}
cout << "\nGauss-Jordan Elimination:\n";
gj(A);
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLy8jaW5jbHVkZSAiYWxnby9kZWJ1Zy5oIgoKaW50IE47CgoKCnZvaWQgZ2oodmVjdG9yPHZlY3Rvcjxkb3VibGU+PiBBKSB7CiAgICAvLyBHYXVzcy1Kb3JkYW4gRWxpbWluYXRpb24KICAgIGZvciAoaW50IGsgPSAwOyBrIDwgTjsgaysrKSB7CiAgICAgICAgLy8gUGFydGlhbCBQaXZvdGluZwogICAgICAgIGludCBtYXhSb3cgPSBrOwogICAgICAgIGZvciAoaW50IGkgPSBrICsgMTsgaSA8IE47IGkrKykgewogICAgICAgICAgICBpZiAoYWJzKEFbaV1ba10pID4gYWJzKEFbbWF4Um93XVtrXSkpIHsKICAgICAgICAgICAgICAgIG1heFJvdyA9IGk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKG1heFJvdyAhPSBrKSB7CiAgICAgICAgICAgIHN3YXAoQVtrXSwgQVttYXhSb3ddKTsKICAgICAgICB9CgogICAgICAgIC8vIE1ha2UgZGlhZ29uYWwgZWxlbWVudCAxCiAgICAgICAgZG91YmxlIGRpYWcgPSBBW2tdW2tdOwogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDw9IE47IGorKykgewogICAgICAgICAgICBBW2tdW2pdIC89IGRpYWc7CiAgICAgICAgfQoKICAgICAgICAvLyBNYWtlIG90aGVyIGVsZW1lbnRzIGluIGNvbHVtbiAwCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKICAgICAgICAgICAgaWYgKGkgIT0gaykgewogICAgICAgICAgICAgICAgZG91YmxlIHIgPSBBW2ldW2tdOwogICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPD0gTjsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgQVtpXVtqXSAtPSByICogQVtrXVtqXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvLyBEaXNwbGF5IHNvbHV0aW9ucwogICAgY291dCA8PCAiU29sdXRpb246XG4iOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKICAgICAgICBjb3V0IDw8ICJ4IiA8PCBpKzEgPDwgIjogIiA8PCBBW2ldW05dIDw8IGVuZGw7CiAgICB9Cn0KCnNpZ25lZCBtYWluKCkgewogICAgLy9mcmVvcGVuKCJFcnJvci50eHQiLCAidyIsIHN0ZGVycik7CiAgICBjb3V0IDw8ICJFbnRlciBOOiBcbiI7CiAgICBjaW4gPj4gTjsKICAgIHZlY3Rvcjx2ZWN0b3I8ZG91YmxlPj4gQShOLCB2ZWN0b3I8ZG91YmxlPihOKzEsIDApKTsKCiAgICBjb3V0IDw8ICJFbnRlcjogXG4iOwogICAgZm9yIChpbnQgaSA9IDA7IGk8TjsgaSsrKSB7CiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPD0gTjsgaisrKSB7CiAgICAgICAgICAgIGNpbiA+PiBBW2ldW2pdOwogICAgICAgIH0KICAgIH0KICAgIGNvdXQgPDwgIlxuR2F1c3MtSm9yZGFuIEVsaW1pbmF0aW9uOlxuIjsKICAgIGdqKEEpOwogICAgcmV0dXJuIDA7Cn0=