9
 8
 6
 4
 7
 5
 2

1  2  3  4  5  6  7  8 
2  4  6  8 11 13 15 17 
3  6 10 13 16 20 23 26 
4  8 13 17 22 26 31 35 
5 11 16 22 27 33 38 44 
6 13 20 26 33 40 46 53 
7 15 23 31 38 46 54 62 
8 17 26 35 44 53 62 71 
 1  2  3  4  5  6  7 
2  4  6 10 12 14 16 
3  6 11 14 17 22 25 
4 10 14 20 24 30 34 
5 12 17 24 31 36 43 
6 14 22 30 36 44 52 
7 16 25 34 43 52 61 
 1  2  3  4  5 
2  4 10 12 14 
3 10 13 20 23 
4 12 20 24 32 
5 14 23 32 41 
 1  2  3 
2 10 12 
3 12 21 
 1  2  3  4  5  6 
2  4  6 11 13 15 
3  6 12 15 21 24 
4 11 15 22 26 33 
5 13 21 26 34 42 
6 15 24 33 42 51 
 1  2  3  4 
2  4 11 13 
3 11 14 22 
4 13 22 31 
 1 

#include <bits/stdc++.h>
using namespace std;
template <class T>
bool ckmin(T& a, const T& b) {
  return b < a ? a = b, 1 : 0;
}
template <class T>
bool ckmax(T& a, const T& b) {
  return a < b ? a = b, 1 : 0;
}
const int M = 1000000007;
const char nl = '\n';
const int MX = 100001;
bool comp(vector<long long>& a, vector<long long>& b) { return a[1] < b[1]; }
vector<int> sieve(int n) {
  vector<bool> prime(n + 1, 1);
  for (int i = 2; i * i < n; i += 1) {
    if (prime[i]) {
      for (int j = 2; i * j < n; j += 1) prime[i * j] = 0;
    }
  }
  prime[1] = 0;
  prime[0] = 0;
  vector<int> v;
  for (int i = 0; i < prime.size(); i += 1) {
    if (prime[i]) v.push_back(i);
  }
  return v;
}
void solve() {
  int n;
  cin >> n;
  n -= 1;
  vector<vector<int>> v(n, vector<int>(n, 0));
  for (int i = 0; i < n; i += 1) v[i][0] = i + 1;
  for (int i = 0; i < n; i += 1) v[0][i] = i + 1;
  for (int i = 1; i < n; i += 1) {
    for (int j = 1; j < n; j += 1) v[i][j] = v[i][0] * v[0][j];
  }
  for (auto x : v) {
    for (auto y : x) cout << y << " ";
    cout << nl;
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  int t;
  t = 1;
  int i = 1;
  while (t--) {
    solve();
    i += 1;
  }
  return 0;
}
