#include <bits/stdc++.h>
void intIntSort(int d[], int m[], int s) {
  int i = -1, j = s, k, t;
  if (s <= 1) return;
  k = (d[0] + d[s - 1]) / 2;
  for (;;) {
    while (d[++i] < k)
      ;
    while (d[--j] > k)
      ;
    if (i >= j) break;
    t = d[i];
    d[i] = d[j];
    d[j] = t;
    t = m[i];
    m[i] = m[j];
    m[j] = t;
  }
  intIntSort(d, m, i);
  intIntSort(d + j + 1, m + j + 1, s - j - 1);
}
int main() {
  int i, j, k, l, m, n, ok;
  int a, b, c, d;
  int edge[30][30];
  int node[30];
  node[0] = 1;
  node[1] = 2;
  k = 3;
  for (i = 2; i < 20; i++) {
    for (;;) {
      node[i] = node[i - 1] + k++;
      ok = 1;
      for (a = 0; a < i + 1; a++)
        for (b = a + 1; b < i + 1; b++)
          for (c = 0; c < i + 1; c++)
            for (d = c + 1; d < i + 1; d++) {
              if (a == c && b == d) continue;
              if (node[a] + node[b] == node[c] + node[d]) ok = 0;
            }
      if (ok) break;
    }
  }
  scanf("%d", &n);
  k = 1;
  for (i = 0; i < n; i++) edge[i][i] = 0;
  for (i = 0; i < n; i++)
    for (j = i + 1; j < n; j++) edge[i][j] = edge[j][i] = node[i] + node[j];
  for (i = 0; i < n; i++) {
    for (j = 0; j < n; j++) {
      if (j) putchar(' ');
      printf("%d", edge[i][j]);
    }
    puts("");
  }
  return 0;
}
