import java.util.Scanner;

// 参考百度百科:https://baike.baidu.com/item/%E6%9D%A8%E8%BE%89%E4%B8%89%E8%A7%92/215098
// 
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        int N = in.nextInt();// 输出杨辉三角形的前n行

        // 1.初始化数组
        long[][] arr = new long[N][];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = new long[i + 1];
        }
        // 2.填充数据
        for (int n = 0; n < arr.length; n++) {
            for (int k = 0; k < arr[n].length; k++) {

                long num = 1;
                for (int i = 1; i <= k; i++) {
				 // 这段代码 num = num * (n - i + 1) / i; 是在计算二项式系数(组合数)的高效算法
                    // 二项式系数公式,二项式系数 C(n, k) 表示从 n 个元素中取 k 个的组合数,公式为: C(n, k) = n! / (k! × (n-k)!)
                    // 原始公式展开:C(n, k) = n × (n-1) × (n-2) × ... × (n-k+1)
                    //                      ---------------------------------
                    //                      1 × 2 × 3 × ... × k

                    // 原始公式展开的推导过程:n! / (n-k)! = [n × (n-1) × (n-2) × ... × 3 × 2 × 1]
                    //             / [(n-k) × (n-k-1) × ... × 3 × 2 × 1]
                    // 注意:分母中的 (n-k) × (n-k-1) × ... × 3 × 2 × 1 会与分子中对应的部分约掉。
                    // 约分后剩下:n × (n-1) × (n-2) × ... × (n-k+1)

                    // 关键思想:交替乘除
                    // 优点:中间结果始终是整数(因为组合数一定是整数)
                    //      避免大数运算(不需要计算阶乘)
                    //      数值稳定性好
                    num = num * (n - i + 1) / i;
                }
                arr[n][k] = num;
            }
        }

        // 3.输出
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                if (j == arr[i].length - 1) {
                    // 不要在行末输出多余的空格
                    System.out.printf("%d", arr[i][j]);
                } else {
                    System.out.printf("%d ", arr[i][j]);
                }
            }
            System.out.println();
        }
    }
}