#include <iostream>
#include <vector>
using namespace std;
int sn(int n) {
return (n * (n + 1)) / 2; //等差为1的数列的前n项和
}
int main() {
int n;
cin >> n;
vector<vector<int>> arr(n + 1, vector<int>(n + 1, 0));
for (int i = 1; i <= n ;
i++) { //每第n行第一列的数据为以前n-1行和n-1列构成的三角形的数据数量+1,数据数量即等差为1的数列前n项和(只数个数不看数据的值)
int j = 1, k = sn(i - 1) + 1,
l = i; //观察规律,数据是以右斜上的方向递增,所以同时定义游标,以右斜上的方向来进行赋值
while (l > 0 && j > 0) {
arr[l--][j++] = k++;
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n - i + 1; j++) {
cout << arr[i][j];
if (j != n) cout << ' ';
}
if (i != n) cout << endl; //按照所规定的格式输出
}
}
// 64 位输出请用 printf("%lld")