//循环赛日程表
//思路:分治策略。使用递归函数分割,直到剩下两个人。
//姓名:刘哲;
//#include <bits/stdc++/h>//头文件
void table(int n);//函数声明
void print(int n);//输出函数
const int maxn=1e4;//假设最大人数
int s[maxn][maxn];//表
int n;
int main()
{
while(cin>>n)
{
memset(s,0,sizeof(s));//初始化
table(n);//调用函数
print(n);//输出函数
}
return 0;
}
void table(int n)
{
if(n==2)
{
s[1][1]=s[2][2]=1;
s[1][2]=s[2][1]=2;
return ;
}
if(n>2) table(n/2);
int k=n/2;
for(int i=1;i<=k;i++)
for(int j=1;j<=k;j++)
{
s[i+k][j+k]=s[i][j];
s[i+k][j]=s[i][j]+k;
s[i][j+k]=s[i][j]+k;
}
}
void print(int n)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
printf("%4d",s[i][j]);//cout<<s[i][j]<<" ";
cout<<endl;
}
}