#include <map>
#include <set>
#include <list>
#include <cmath>
#include <ctime>
#include <deque>
#include <queue>
#include <stack>
#include <string>
#include <bitset>
#include <cstdio>
#include <limits>
#include <vector>
#include <climits>
#include <cstring>
#include <cstdlib>
#include <fstream>
#include <numeric>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <unordered_map>

using namespace std;

int knightTrav(int x,int y,int a,int b,int n,vector<vector<int>> &board) {
    if(x<0 || x>=n || y<0 || y>=n)
        return -1;
    if(x==n-1 && y==n-1)
        return 0;
    board[x][y]=1;
    int i,j,cur;
    int min=-1;
    if(x+a>=0 && x+a<n && y+b>=0 && y+b<n && board[x+a][y+b]==0) {
        cur=knightTrav(x+a,y+b,a,b,n,board);
        if(cur!=-1) {
            if(min==-1 || cur+1<min)
                min=cur+1;
        }
    }
    if(x+a>=0 && x+a<n && y-b>=0 && y-b<n && board[x+a][y-b]==0) {
        cur=knightTrav(x+a,y-b,a,b,n,board);
        if(cur!=-1) {
            if(min==-1 || cur+1<min)
                min=cur+1;
        }
    }
    if(x-a>=0 && x-a<n && y+b>=0 && y+b<n && board[x-a][y+b]==0) {
        cur=knightTrav(x-a,y+b,a,b,n,board);
        if(cur!=-1) {
            if(min==-1 || cur+1<min)
                min=cur+1;
        }
    }
    if(x-a>=0 && x-a<n && y-b>=0 && y-b<n && board[x-a][y-b]==0) {
        cur=knightTrav(x-a,y-b,a,b,n,board);
        if(cur!=-1) {
            if(min==-1 || cur+1<min)
                min=cur+1;
        }
    }
    if(x+b>=0 && x+b<n && y+a>=0 && y+a<n && board[x+b][y+a]==0) {
        cur=knightTrav(x+b,y+a,a,b,n,board);
        if(cur!=-1) {
            if(min==-1 || cur+1<min)
                min=cur+1;
        }
    }
    if(x+b>=0 && x+b<n && y-a>=0 && y-a<n && board[x+b][y-a]==0) {
        cur=knightTrav(x+b,y-a,a,b,n,board);
        if(cur!=-1) {
            if(min==-1 || cur+1<min)
                min=cur+1;
        }
    }
    if(x-b>=0 && x-b<n && y+a>=0 && y+a<n && board[x-b][y+a]==0) {
        cur=knightTrav(x-b,y+a,a,b,n,board);
        if(cur!=-1) {
            if(min==-1 || cur+1<min)
                min=cur+1;
        }
    }
    if(x-b>=0 && x-b<n && y-a>=0 && y-a<n && board[x-b][y-a]==0) {
        cur=knightTrav(x-b,y-a,a,b,n,board);
        if(cur!=-1) {
            if(min==-1 || cur+1<min)
                min=cur+1;
        }
    }
    board[x][y]=0;
    return min;
    
    
}

void printBoard(vector<vector<int>> board,int n) {
    for(int i=0;i<n;i++) {
        for(int j=0;j<n;j++) {
            cout<<board[i][j]<<" ";
        }       
        cout<<endl;
    }
    cout<<endl;
}
int main(){
    int n;
    cin >> n;
    int i,j;
    vector<vector<int>> board(n,vector<int>(n,0));
    for(i=1;i<n;i++) {
        for(j=1;j<n;j++) {
            if(i==j) {
                if((n-1)%i==0)
                    cout<<(n-1)/i<<" ";
                else
                    cout<<-1<<" ";
            } else
                cout<<knightTrav(0,0,i,j,n,board)<<" ";
            //printBoard(board,n);
        }
       cout<<endl;
    }
    //cout<<knightTrav(0,0,3,4,n,board)<<" ";        
    return 0;
}