import sys def prime(x): if x < 2: return False d = 2 while d * d <= x: if x % d == 0: return False d += 1 return True def factors(x): result, d = [], 2 while d * d <= x: if x % d == 0: result.append(d) while x % d == 0: x //= d d += 1 if x > 1: result.append(x) return result n = int(sys.stdin.buffer.readline()); size = n * n p = size + 1 while not prime(p): p += 1 fs = factors(p - 1) g = next(x for x in range(2, p) if all(pow(x, (p - 1) // q, p) != 1 for q in fs)) mod, power, marks = p * (p - 1), 1, [] for i in range(p - 1): marks.append((p * i + (p - 1) * power) % mod) power = power * g % p marks.sort(); ext = marks + [x + mod for x in marks] def pos(r, c): return r * n + (c if r % 2 == 0 else n - 1 - c) edges = [(pos(r, c), pos(r + 1, c)) for r in range(n - 1) for c in range(n)] + [(pos(r, c), pos(r, c + 1)) for r in range(n) for c in range(n - 1)] best, start = 10**30, 0 for s in range(p - 1): maximum = 0 for u, v in edges: maximum = max(maximum, abs(ext[s + u] - ext[s + v])) if maximum >= best: break if maximum < best: best, start = maximum, s mark = [ext[start + i] - ext[start] for i in range(size)] out = [] for r in range(n - 1): out.append(" ".join(str(abs(mark[pos(r, c)] - mark[pos(r + 1, c)])) for c in range(n))) for r in range(n): out.append(" ".join(str(abs(mark[pos(r, c)] - mark[pos(r, c + 1)])) for c in range(n - 1))) print("\n".join(out))