#include <iostream>
using namespace std;

int main() {
    int trag[34][34];
    trag[0][0]=1;
    for(int j=1;j<=33;j++)
    trag[0][j]=0;
    int n;
    while (cin >>n) { // 注意 while 处理多个 case
        for(int i=1;i<=33;i++) //i是行数
          {trag[i][0]=1; //每行第一列直接设为1
          for(int j=1;j<=33;j++)//j是列数,第一列已为1,直接从第二列赋值
          {
            trag[i][j]=trag[i-1][j]+trag[i-1][j-1];//其值为上方加上左方数之和
          }
          }

          for(int i=0;i<n;i++)
          {
            for(int j=0;j<i;j++)//第n行只输出前n-1个数
            cout<<trag[i][j]<<" ";
            cout<<trag[i][i]<<endl;//最后一个数单独输出,不带空格,额外加一个换行
          }

    }
}
// 64 位输出请用 printf("%lld")

递归的解法到底是怎么想出来的