#include <iostream>
#include <vector>
#include <iomanip>
using namespace std;
int main() {
int n;
cout << "Enter the order of square matrix: ";
cin >> n;
vector<vector<double>> A(n, vector<double>(n));
vector<vector<double>> L(n, vector<double>(n, 0));
vector<vector<double>> U(n, vector<double>(n, 0));
vector<double> B(n), Y(n), X(n);
cout << "Enter matrix elements:\n";
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
cin >> A[i][j];
cout << "Enter the constant terms:\n";
for (int i = 0; i < n; i++)
cin >> B[i];
// LU Decomposition
for (int j = 0; j < n; j++) {
for (int i = 0; i < n; i++) {
if (i <= j) {
U[i][j] = A[i][j];
for (int k = 0; k < i; k++)
U[i][j] -= L[i][k] * U[k][j];
if (i == j)
L[i][j] = 1;
} else {
L[i][j] = A[i][j];
for (int k = 0; k < j; k++)
L[i][j] -= L[i][k] * U[k][j];
L[i][j] /= U[j][j];
}
}
}
// Forward substitution to solve L*Y = B
for (int i = 0; i < n; i++) {
Y[i] = B[i];
for (int j = 0; j < i; j++)
Y[i] -= L[i][j] * Y[j];
}
// Backward substitution to solve U*X = Y
for (int i = n - 1; i >= 0; i--) {
X[i] = Y[i];
for (int j = i + 1; j < n; j++)
X[i] -= U[i][j] * X[j];
X[i] /= U[i][i];
}
// Output L
cout << "\n[L]:\n";
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++)
cout << fixed << setprecision(3) << setw(8) << L[i][j];
cout << endl;
}
// Output U
cout << "\n[U]:\n";
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++)
cout << fixed << setprecision(3) << setw(8) << U[i][j];
cout << endl;
}
// Output Y
cout << "\n[Y]: ";
for (int i = 0; i < n; i++)
cout << fixed << setprecision(3) << Y[i] << " ";
cout << endl;
// Output X
cout << "\n[X]: ";
for (int i = 0; i < n; i++)
cout << fixed << setprecision(3) << X[i] << " ";
cout << endl;
return 0;
}