#include <bits/stdc++.h>
using namespace std;
char BUF_I[1048576], *S_I = BUF_I, *T_I = BUF_I;
struct Input {
  Input() {}
  inline Input &operator>>(char &c) {
    return (c = ((S_I == T_I) &&
                         (T_I = (S_I = BUF_I) + fread(BUF_I, 1, 1048576, stdin),
                          S_I == T_I)
                     ? EOF
                     : *S_I++),
            *this);
  }
  template <class T>
  inline Input &operator>>(T &S_I) {
    S_I = 0;
    char c;
    while (*this >> c, c < 48 || c > 57)
      ;
    while (S_I = S_I * 10 + c - 48, *this >> c, c > 47 && c < 58)
      ;
    return *this;
  }
  inline int Getint() {
    char c;
    register int S_I = 0;
    register bool w = false;
    while (*this >> c, c == 45 && (w = true), c < 48 || c > 57)
      ;
    while (S_I = S_I * 10 + c - 48, *this >> c, c > 47 && c < 58)
      ;
    return w ? -S_I : S_I;
  }
} tin;
char BUF_O[262144], *S_O = BUF_O, *Limit_O = BUF_O + 262144;
struct Output {
  ~Output() { Flush(); }
  inline int Flush() {
    fwrite(BUF_O, 1, S_O - BUF_O, stdout);
    S_O = BUF_O;
    return 0;
  }
  inline Output &operator<<(const char &c) {
    if (S_O == Limit_O) Flush();
    return (*S_O++ = c, *this);
  }
  template <class T>
  inline Output &operator<<(T x) {
    static char Stack[25];
    static int Top;
    if (x < (Top = 0)) *this << '-', x = -x;
    do {
      Stack[++Top] = x % 10 + 48;
    } while (x /= 10);
    while (Top) (*this) << Stack[Top--];
    return *this;
  }
} tout;
int n, a[1005][1005];
int main() {
  tin >> n;
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n; j++) a[i][j] = (i + j - 2) % (n - 1) + 1;
  for (int i = 1; i <= n; i++) {
    a[i][n] = a[n][i] = a[i][i];
    a[i][i] = 0;
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) tout << a[i][j] << ' ';
    tout << '\n';
  }
  return 0;
}
