////////////////////////////////////////////
///                                      ///
///         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;
const LL MAXN = 1e6;
const LL MOD = 1e9 + 7;
LL arr[N + 5][N + 5];
vector<int> vec;

map<LL, LL> ms;

LL random() {
	LL res = 0;
	for(int i = 0;i < 26;i++) {
		LL u = rand() % MAXN + 1;
		if(u % 2) res = (res + u) % MOD;
		else res = (res * u) % MOD;
	}
	return res;
}

void hora(int tc) {
	srand(time(NULL));
	int n;
	cin>>n;
	for(int i = 0;i < n;i++) {
		for(int j = i + 1;j < n;j++) arr[i][j] = arr[j][i] = random();
	}
	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;
}


