#include<iostream>
using namespace std;

int a[100][100];
int n;    //选手的个数

/*
tox:目标数组的行号 
toy:目标数组的列号 
fromx:源数组的行号 
fromy:源数组的列号 
r:数组的大小为 r*r 
*/
void copy(int tox, int toy, int fromx, int fromy, int r)
{
    for(int i = 0; i < r; i++)
        for(int j = 0; j < r; j++)  
            a[tox+i][toy+j] = a[fromx+i][fromy+j];
}

void table(int k)
{    
    n = 1 << k;    
    //构造正方形表格的第一行数据
    for(int i = 0; i < n; i++)
        a[0][i] = i + 1;
    //采用分治算法,构造整个循环赛日程表
    for(int r = 1; r < n; r <<= 1)
        for(int i = 0; i < n; i += 2*r)
        { 
            copy(r, r + i, 0, i, r);        //左上角复制到右下角 
            copy(r, i, 0, r + i, r);        //右上角复制到左下角 
        }
}


int main()
{
    int k;
    cin>>k; 
    
    table(k);
    
    for(int i = 0; i < n; i++)
    {
        for(int j = 0; j < n; j++)
        {
            cout<< a[i][j] << " ";
        }
        cout<<endl;
    } 
    return 0;
}
/**************************************************************
	Problem: 1377
	User: admin
	Language: C++
	Result: Accepted
	Time:9 ms
	Memory:2116 kb
****************************************************************/