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; } }