#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef vector<double> Vec;
typedef vector<Vec> Matrix;
double eps = 1e-6;
void luSlau(Matrix A, Vec b, Matrix &L, Matrix &U, Vec &x)
{
int size = A.size();
for (int i = 0; i < size; ++i)
{
U[0][i] = A[0][i];
}
for (int i = 0; i < size; ++i)
{
L[i][0] = A[i][0] / U[0][0];
}
for (int i = 1; i < size; ++i)
{
for (int j = i; j < size; ++j)
{
double sum = 0;
for (int k = 0; k < i; ++k)
{
sum += L[i][k] * U[k][j];
}
U[i][j] = A[i][j] - sum;
if (i > j)
L[j][i] = 0;
else
{
double sum = 0;
for (int k = 0; k < i; ++k)
{
sum += L[j][k] * U[k][i];
}
L[j][i] = (A[j][i] - sum) / U[i][i];
}
}
}
Vec y(size);
for (int i = 0; i < size; ++i)
{
for (int j = 0; j < i; ++j)
{
b[i] -= L[i][j] * y[j];
}
y[i] = b[i] / L[i][i];
}
for (int i = size - 1; i >= 0; --i)
{
for (int j = i + 1; j < size; ++j)
{
y[i] -= U[i][j] * x[j];
}
x[i] = y[i] / U[i][i];
}
}
void jacobi(Matrix A, Vec b, Vec &x, int &it)
{
double maxNorm;
int size = A.size();
Vec temp(size);
Vec max(size);
double maxi;
for (int i = 0; i < size; ++i)
{
maxi = 0;
for (int j = 0; j < size; ++j)
{
if (A[i][j] > maxi)
{
maxi = A[i][j];
max[i] = j;
}
}
}
for (int i = 0; i < size - 1; ++i)
{
for (int j = 0; j < size; ++j)
{
if (i == max[j])
{
Vec t = A[i];
A[i] = A[j];
A[j] = t;
double temp = b[i];
b[i] = b[j];
b[j] = temp;
break;
}
}
}
for (int i = 0; i < size; ++i)
{
x[i] = b[i] / A[i][i];
}
it = 0;
do
{
for (int i = 0; i < size; ++i)
{
temp[i] = b[i];
for (int j = 0; j < size; ++j)
{
if (j != i)
{
temp[i] -= A[i][j] * x[j];
}
}
temp[i] /= A[i][i];
}
maxNorm = fabs(x[0] - temp[0]);
for (int i = 0; i < size; ++i)
{
maxNorm = std::max(fabs(x[i] - temp[i]), maxNorm);
x[i] = temp[i];
}
it++;
} while (maxNorm > eps);
}
int main()
{
freopen("input.txt", "r", stdin);
int n;
cin >> n;
Matrix A(n, Vec(n, 0));
Vec b(n);
Vec vecRes(A.size());
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < n; ++j)
{
cin >> A[i][j];
}
cin >> b[i];
}
Matrix L(n,Vec(n,0)), U(n, Vec(n,0));
luSlau(A, b, L, U, vecRes);
for (int i = 0; i < n; ++i)
{
cout << "X" << i + 1 << " = " << vecRes[i] << " " ;
}
cout << endl;
vecRes.assign(n, 0);
int it = 0;
jacobi(A, b, vecRes, it);
for (int i = 0; i < n; ++i)
{
cout << "X" << i + 1 << " = " << vecRes[i] << " " ;
}
cout << endl;
cout << it << endl;
}