////////////////////////////////////////////
///                                      ///
///         Template ver. 1 rapel        ///
/// Fear is Temporary, Regret is Forever ///
///          Must Try and Get AC         ///
///                                      ///
////////////////////////////////////////////
#include <stdio.h>
#include <iostream>
#include <sstream>
#include <iomanip>
 
#include <algorithm>
#include <stdlib.h>
#include <string.h>
#include <string>
#include <utility>
 
#include <math.h>
#include <complex>
 
#include <assert.h>
#include <time.h>
//#include <chrono>
//#include <random>
 
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <list>
#include <bitset>
 
#define FI first
#define SE second
#define MP make_pair
#define PB push_back
#define PF push_front
#define POB pop_back
#define POF pop_front
#define endl '\n'
using namespace std;
 
typedef long long LL;
typedef unsigned long long ULL;
 
void desperate_optimization(int precision){
  	ios_base::sync_with_stdio(false);
  	cin.tie(0);
  	cout.tie(0);
  	cout.setf(ios::fixed);
  	cout.setf(ios::showpoint);
  	cout.precision(precision);
}
 
const int N = 10;
LL arr[N + 5][N + 5];
set<int> st;
set<int> nx;
vector<int> vec;
 
void hora(int tc) {
	int n;
	cin>>n;
	st.insert({1, 2, 4, 7, 12, 20, 29, 38, 52, 73});
//	for(int i = 1;i < n;i++) {
//		nx.clear();
//		for(auto x: st) {
//			nx.insert(x);
//			for(auto y: st) {
//				if(x == y) continue;
//				nx.insert(x + y);
//			}
//		}
//		int mx = -1;
//		int now = 0;
//		for(auto x: nx) {
//			if(x != now + 1) {
//				mx = now + 1;
//				break;
//			}
//			now = x;
//		}
//		if(mx == -1) mx = now + 1;
//		st.insert(mx);		
//	}
//	for(auto x: st) cout<<x<<endl;
	LL maxi = 0;
	vec.PB(0);
	for(int i = 1;i < n;i++) {
		int j = 0;
		for(auto x: st) {
			if(i == j) break;
			arr[i][j] = arr[j][i] = (maxi + 1) * x;
			j++;
		}
		vec.PB(i);
		sort(vec.begin(), vec.end());
		do{
			LL tots = 0;
			for(int i = 1;i < vec.size();i++) tots += arr[vec[i - 1]][vec[i]];
			maxi = max(maxi, tots);
		}while(next_permutation(vec.begin(), vec.end()));
	}
	for(int i = 0;i < n;i++) {
		for(int j = 0;j < n;j++) {
			if(j) cout<<" ";
			cout<<arr[i][j];
		}
		cout<<endl;
	}
}
 
int main(){
	desperate_optimization(10);
	int ntc = 1;
	//cin>>ntc;
	for(int tc = 1;tc <= ntc;tc++) hora(tc);
	return 0;
}
 