#include <iostream>
#include <assert.h>
#include <stdlib.h>
using namespace std;
class TriMat {
private:
int Size;
int** M;
public:
TriMat(int n) {
Size = n;
M = (int**) malloc(Size * sizeof(int));
for (int k = 0; k < Size; k++) {
M[k] = (int*) malloc((Size - k) * sizeof(int));
for (int j = 0; j <= Size - 1 - k; j++)
cin >> M[k][j];
}
}
// Конструктор скалярной матрицы с заданным элементом на главной диагонали
TriMat(int n, int a) {
Size = n;
M = (int**) malloc(Size * sizeof(int));
for (int k = 0; k < Size; k++) {
M[k] = (int*) malloc((Size - k) * sizeof(int));
M[k][0] = a;
}
}
void print() {
for (int k = 0; k < Size; k++) {
for (int j = 0; j < k; j++)
cout << "\t";
for (int j = 0; j <= Size - 1 - k; j++)
cout << M[k][j] << "\t";
cout << endl;
}
}
int* operator[](size_t k) {
assert(0 <= k && k < Size);
return M[k];
}
void assign(int i, int j, int a) {
assert(0 <= i && i < Size && 0 <= j && j < Size);
M[i][j] = a;
}
int el(int i, int j) {
assert(0 <= i && i < Size && 0 <= j && j < Size);
return M[i][j];
}
TriMat operator+ (TriMat B) {
TriMat C(Size);
for (int k = 0; k < Size; k++)
for (int j = 0; j <= Size - 1 - k; j++)
C[k][j] = M[k][j] + B[k][j];
return C;
}
TriMat operator= (TriMat B) {
for (int k = 0; k < Size; k++)
for (int j = 0; j <= Size - 1 - k; j++)
M[k][j] = B[k][j];
return *this;
}
TriMat operator* (TriMat B) {
TriMat C(Size);
for (int k = 0; k < Size; k++)
for (int j = k; j < Size; j++) {
for (int r = k; r <= j; r++)
C[k][j-k] += M[k][r-k] * B[r][j-r];
}
return C;
}
};
int main() {
int n;
cin >> n;
TriMat A(n), B(n), I(n,1), C = A * (I + B*B);
A.print();
B.print();
C.print();
return 0;
}