#include <bits/stdc++.h>

using namespace std;

#define _for(i,j,N) for(int i = (j);i < (N);i++)
#define _rep(i,j,N) for(int i = (j);i <= (N);i++)
#define ALL(x) x.begin(),x.end()
#define pb push_back
#define mk make_pair

typedef long long LL;
typedef pair<int,int> Interval;

template<typename T>
ostream& operator<<(ostream& os,const vector<T>& v) {
    _for(i,0,v.size()) os << v[i] << " ";
    return os;
}

template<typename T>
ostream& operator<<(ostream& os,const set<T>& v){
    for(typename set<T>::iterator it = v.begin();it != v.end();it++)
    os << *it <<" ";
    return os;
}

template<typename T1,typename T2>
ostream& operator<<(ostream& os,const pair<T1,T2>& v){
    os << v.first <<" "<<v.second<<endl;
    return os;
}

const int maxn = 11;
LL num = 1;
LL bef = 0;
int n;
LL ans[maxn][maxn];
LL p[maxn];
set<int> si;
set<int> sii;

bool valid(int num){
    for(int a:si){
        if(si.count(num+a) || si.count(num) || sii.count(num) || sii.count(num+a)) return false;
    }
    return true;
}

map<LL,int> mp;

LL check(vector<int> &vi){
    LL ret = 0;
    _for(i,0,vi.size()-1){
        ret += ans[vi[i]][vi[i+1]];
    }
    return ret;
}

LL cal(int nn){
    vector<int> vi;
    _for(i,0,nn){
        vi.pb(i);
    }

    LL biggest = 0;
    do{
        biggest = max(biggest,check(vi));
    }while(next_permutation(ALL(vi)));
    return biggest;
}

int main()
{
    scanf("%d",&n);

    num = 1;
    _for(i,0,n){
        while(!valid(num)){
            num++;
        }
        for(auto a:si){
            sii.insert(a+num);
        }

        si.insert(num);
        p[i] = num;
    }

    num = 1;
    _for(i,1,n){
        _for(j,0,i){
            (ans[i][j] = ((ans[j][i]) = p[j] * num));;
        }
        num = cal(i+1) + 1;
        //cout <<"ok"<<endl;
    }

    //cout << cal(10) << endl;

    _for(i,0,n){
        _for(j,0,n){
            if(j) printf(" ");
            printf("%lld",ans[i][j]);
        }
        printf("\n");
    }

   // cout << longest << endl;

    return 0;
}
