#include <bits/stdc++.h>
using namespace std;
const long long INF = 0x3f3f3f3f;
void read() {}
void say() {}
void say_() {}
template <typename T, typename... T2>
inline void read(T &_, T2 &...oth) {
  int __ = 0;
  _ = 0;
  char ch = getchar();
  while (!isdigit(ch)) {
    if (ch == '-') __ = 1;
    ch = getchar();
  }
  while (isdigit(ch)) {
    _ = _ * 10 + ch - 48;
    ch = getchar();
  }
  _ = __ ? -_ : _;
  read(oth...);
}
template <typename T>
void Out(T _) {
  if (_ < 0) {
    putchar('-');
    _ = -_;
  }
  if (_ >= 10) Out(_ / 10);
  putchar(_ % 10 + '0');
}
template <typename T, typename... T2>
inline void say(T _, T2... oth) {
  Out(_);
  putchar('\n');
  say(oth...);
}
template <typename T, typename... T2>
inline void say_(T _, T2... oth) {
  Out(_);
  putchar(' ');
  say_(oth...);
}
const long long N = 1005;
long long n;
long long a[N][N], vis[N];
void print() {
  for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= n; ++j) cout << a[i][j] << " ";
    cout << endl;
  }
}
int main() {
  read(n);
  a[0][1] = -1;
  for (int i = 1; i <= n; ++i) {
    for (int i = 1; i <= n; ++i) vis[i] = 0;
    for (int j = 1; j <= i - 1; ++j) vis[a[i][j]] = 1;
    long long cur = (a[i - 1][i] + 1) % (n - 1) + 1;
    for (int j = i + 1; j <= n; ++j) {
      while (vis[cur]) {
        ++cur;
        if (cur > n - 1) cur = 1;
      }
      vis[cur] = 1;
      a[i][j] = cur;
    }
    for (int j = i + 1; j <= n; ++j) a[j][i] = a[i][j];
  }
  print();
}
