#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>

int cal_approach(int i,int j,int n);

int main(){
	
	int size_n;

	scanf("%d",&size_n);

	int **matrix;
	
	matrix = (int**)malloc(sizeof(int*)*(size_n));
	for(int i=0;i<size_n;i++){
		matrix[i] = (int*)malloc(sizeof(int)*(size_n));
		for(int j=0;j<size_n;j++){
			matrix[i][j] = -1;
		}
	}

	for(int i=1;i<=(size_n-1)/2;i++){
		for(int j=i; j<size_n;j++){
			if(i == j){
				if((size_n-1)%(i) == 0){
					matrix[i][i] = (size_n-1)/(i);
				}
				else
					matrix[i][i] = -1;
			}
			else{

				matrix[i][j] = cal_approach(i,j,size_n-1);
				matrix[j][i] = matrix[i][j];
			}
		}
	}

	matrix[size_n-1][size_n-1] = 1;

	for(int i=1;i<size_n;i++){
		for(int j=1 ; j<size_n;j++){
			printf("%d", matrix[i][j]);
			if(j==size_n-1){
				break;
			}
			printf(" ");
		}
		if(i == size_n-1)
			break;
		printf("\n");
	}
    
    return 0;
}


int cal_approach(int i,int j,int size_n){
	int min = 999999999;
	int m;
	int n=1;

	if(size_n%(i+j) == 0 ){
		return 2*(size_n/(i+j));
	}
	else
		m = size_n / (i+j);

	if(m == 0){
		m=1;
		for(;;m++){
			if((m*(i+j) - size_n)%(j-i) == 0 ){
				n = (m*(i+j) - size_n) / (j - i) ;
				if(n<0)
					n*=-1;
				return 2*(m+n);
			}
		}
	}
	else{
		n = (size_n - (m*(i+j))) / (j - i);
		if(n<0)
			n*=-1;
		return 2*(m+n);
	}

}