#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define INF (int)1e9
int ans[30][30];
int mo[30][30];

int main()
{
   int n; scanf("%d", &n);
   for(int i=1;i<n;i++)
   {
      for(int j=i;j<n;j++)
      {
          //memset
          for(int ii=0;ii<n;ii++)
             for(int jj=0;jj<n;jj++) mo[ii][jj]=INF;

          queue<pair<int, pair<int, int> > > q;
          q.push(mp(0,mp(0,0))); mo[0][0]=0;
          while(!q.empty())
          {
             int curi=q.front().fi, curj=q.front().se.fi, curm=q.front().se.se;
             q.pop();
             if(curi==n-1 && curj==n-1) { ans[i][j]=ans[j][i]=curm; break; }
             for(int k=-1;k<=1;k+=2)
             {
                for(int l=-1;l<=1;l+=2)
                {
                   int ni=curi+k*i, nj=curj+l*j;
                   if(0<=ni && ni<n && 0<=nj && nj<n && curm+1<mo[ni][nj])
                   {
                      mo[ni][nj]=curm+1;
                      q.push(mp(ni,mp(nj,curm+1)));
                   }

                   ni=curi+k*j, nj=curj+l*i;
                   if(0<=ni && ni<n && 0<=nj && nj<n && curm+1<mo[ni][nj])
                   {
                      mo[ni][nj]=curm+1;
                      q.push(mp(ni,mp(nj,curm+1)));
                   }
                }
             }
          }
      }
   }
   for(int i=1;i<n;i++)
   {
      for(int j=1;j<n;j++)
      {
         if(ans[i][j]==0) printf("-1");
         else printf("%d", ans[i][j]);
         if(j+1<n) printf(" ");
         else printf("\n");
      }
   }
   return 0;
}