import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;

public class Solution {
       	
	static int[][] mem;
	static int n;
	static Queue<Pair> q;
	static int[][] sdist;
	
	public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        n = in.nextInt();
        mem = new int[n][n];
        for(int p = 1; p<n; p++){
        	for(int o = 1; o<n; o++){
        		System.out.print(knight(p, o) + " ");
        	}
        	System.out.println();
        }
	}
	
	static int knight(int a, int b){
		sdist = new int[n][n];
		q = new LinkedList<Pair>();
		travel(new Pair(new Point(0, 0), 0), a, b);
		while(!q.isEmpty()){
			Pair p = q.poll();
			travel(p, a, b);
		}
		int dist = sdist[n-1][n-1];
		return (dist > 0 ? dist : -1);
	}
	
	static void travel(Pair p, int a, int b){
		int x = p.p.x;
		int y = p.p.y;
		int d = p.dist;
		if(x >= n || y >= n || x < 0 || y < 0 || sdist[x][y] != 0) return;
		sdist[x][y] = d;
		if(x == n-1 && y == n-1) return;
		q.addAll(findNeighbours(p, a, b));
	}
	
	static ArrayList<Pair> findNeighbours(Pair p, int a, int b){
		int x = p.p.x;
		int y = p.p.y;
		int d = p.dist;
		Point[] moves = {new Point(x+a, y+b), new Point(x+a, y-b), new Point(x-a, y+b), new Point(x-a, y-b),
				new Point(x+b, y+a), new Point(x+b, y-a), new Point(x-b, y+a), new Point(x-b, y-a)};
		
		ArrayList<Pair> next = new ArrayList<>(moves.length);
		for(int i = 0; i<moves.length; i++){
			next.add(new Pair(moves[i], d+1));
		}
		return next;
	}
	
	
}

class Point{
	int x, y;
	public Point(int _x, int _y){
		x = _x;
		y = _y;
	}
}

class Pair{
	Point p;
	int dist;
	public Pair(Point _p, int _d){
		p = _p;
		dist = _d;
	}
}