#include <bits/stdc++.h>
inline long long read() {
  long long x = 0;
  char c = getchar(), f = 1;
  for (; c < '0' || '9' < c; c = getchar())
    if (c == '-') f = -1;
  for (; '0' <= c && c <= '9'; c = getchar()) x = x * 10 + c - '0';
  return x * f;
}
inline void write(long long x) {
  static int buf[20], len;
  len = 0;
  if (x < 0) x = -x, putchar('-');
  for (; x; x /= 10) buf[len++] = x % 10;
  if (!len)
    putchar('0');
  else
    while (len) putchar(buf[--len] + '0');
}
inline void writeln(long long x) {
  write(x);
  putchar('\n');
}
inline void writesp(long long x) {
  write(x);
  putchar(' ');
}
long long cnt[30], base[30], now[30];
int a[30], mx[30], v[1010];
long long mp[15][15];
int n;
std::map<long long, int> mark;
int vis[200010];
int dfs(int S, int now, int dep, long long dis) {
  if (dep == n && now > S) {
    if (mark[dis]) return 0;
    mark[dis] = 1;
  }
  for (int i = 1; i <= n; i++)
    if (!vis[i]) {
      vis[i] = 1;
      if (!dfs(S, i, dep + 1, dis + mp[now][i])) return 0;
      vis[i] = 0;
    }
  return 1;
}
int check() {
  int flag = 1;
  mark.clear();
  memset(vis, 0, sizeof(vis));
  for (int i = 1; i <= n; i++) {
    vis[i] = 1;
    flag &= dfs(i, i, 1, 0);
    vis[i] = 0;
  }
  return flag;
}
int main() {
  n = read();
  int k = 1;
  a[0] = 0;
  for (int i = 1; i <= n; i++) {
    while (1) {
      int flag = 1;
      for (int j = 0; j < i; j++)
        if (v[k + a[j]]) flag = 0;
      if (flag) break;
      ++k;
    }
    a[i] = k;
    for (int j = 0; j < i; j++) v[a[i] + a[j]] = 1;
  }
  base[1] = 1;
  for (int i = 1; i < n; i++)
    base[i + 1] = base[i] * (a[n - i] + a[n - i - 1] + 1);
  for (int i = 1; i < n; i++)
    for (int j = i + 1; j <= n; j++) {
      ++now[i];
      mp[i][j] = mp[j][i] = a[now[i]] * base[i];
    }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) writesp(mp[i][j]);
    putchar('\n');
  }
  return 0;
}
