/* Author : Jordhy Fernando */
#include<bits/stdc++.h>
#define ll long long
#define For(i,j,n) for(int i = j; i < n; i++)
#define EPS 1e-12

using namespace std;
typedef vector<int> vi;
typedef pair<int, int> ii;
typedef vector<ii> vii;

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;

int main(){
    int n;
    int d[26][26], memo[26][26];
    cin >> n;
    for(int i = 0; i < 26; i++){
        for(int j = 0; j < 26; j++){
            memo[i][j] = -2;
        }
    }
    for(int i = 1; i < n; i++){
        for(int j = 1; j < n; j++){
            if(j > 1){
                cout << " ";
            }
            if(memo[i][j] != -2 || memo[j][i] != -2){
                cout << memo[i][j];
            }
            else{
                for(int k = 0; k < n; k++){
                    for(int l = 0; l < n; l++){
                        d[k][l] = -1;
                    }
                }
                queue<int> q1, q2;
                d[0][0] = 0;
                q1.push(0);
                q2.push(0);
                while(!q1.empty()){
                    int nowx, nowy;
                    nowx = q1.front();
                    nowy = q2.front();
                    q1.pop();
                    q2.pop();
                    if(nowx - i >= 0 && nowy - j >= 0){
                        if(d[nowx - i][nowy - j] == -1){
                            d[nowx - i][nowy - j] = d[nowx][nowy] + 1;
                            q1.push(nowx - i);
                            q2.push(nowy - j);
                        }
                    }
                    if(nowx - j >= 0 && nowy - i >= 0){
                        if(d[nowx - j][nowy - i] == -1){
                            d[nowx - j][nowy - i] = d[nowx][nowy] + 1;
                            q1.push(nowx - j);
                            q2.push(nowy - i);
                        }
                    }
                    if(nowx + i < n && nowy + j < n){
                        if(d[nowx + i][nowy + j] == -1){
                            d[nowx + i][nowy + j] = d[nowx][nowy] + 1;
                            q1.push(nowx + i);
                            q2.push(nowy + j);
                        }
                    }
                    if(nowx + j < n && nowy + i < n){
                        if(d[nowx + j][nowy + i] == -1){
                            d[nowx + j][nowy + i] = d[nowx][nowy] + 1;
                            q1.push(nowx + j);
                            q2.push(nowy + i);
                        }
                    }
                    if(nowx + i < n && nowy - j >= 0){
                        if(d[nowx + i][nowy - j] == -1){
                            d[nowx + i][nowy - j] = d[nowx][nowy] + 1;
                            q1.push(nowx + i);
                            q2.push(nowy - j);
                        }
                    }
                    if(nowx + j < n && nowy - i >= 0 ){
                        if(d[nowx + j][nowy - i] == -1){
                            d[nowx + j][nowy - i] = d[nowx][nowy] + 1;
                            q1.push(nowx + j);
                            q2.push(nowy - i);
                        }
                    }
                    if(nowx - i >= 0 && nowy + j < n){
                        if(d[nowx - i][nowy + j] == -1){
                            d[nowx - i][nowy + j] = d[nowx][nowy] + 1;
                            q1.push(nowx - i);
                            q2.push(nowy + j);
                        }
                    }
                    if(nowx - j >= 0 && nowy + i < n){
                        if(d[nowx - j][nowy + i] == -1){
                            d[nowx - j][nowy + i] = d[nowx][nowy] + 1;
                            q1.push(nowx - j);
                            q2.push(nowy + i);
                        }
                    }
                }
                cout << d[n - 1][n - 1];
                memo[i][j] = memo[j][i] = d[n - 1][n - 1];
            }
        }
       cout << endl;
    }
    return 0;
}