import sys sys.setrecursionlimit(10**6) def EulerPath(m, edges, s=0): used = [False] * m path = [] def dfs(pos): for npos, i in edges[pos]: if used[i]: continue used[i] = True dfs(npos) path.append(i) dfs(s) return path[::-1] def solve(n): if n == 1: print("No") return print("Yes") n2 = n - (n % 2) edges = [[] for _ in range(1 << n2)] E = [] m = 0 for i in range(1 << n2): for j in range(n2): if i >> j & 1: continue edges[i].append((i ^ (1 << j), m)) edges[i ^ (1 << j)].append((i, m)) m += 1 E.append(1 << j) path = EulerPath(m, edges) A = [[0] * (1 << n) for _ in range(1 << n)] add = 0 if n % 2 == 1: add = 1 << (n - 1) s = 0 for p in path: t = s ^ E[p] A[s][t] = 1 A[t][s] = -1 if add != 0: A[s + add][t + add] = -1 A[t + add][s + add] = 1 s = t if n % 2 == 1: for i in range(0, 1 << (n - 1), 2): u1 = i u2 = i + 1 u3 = i + add + 1 u4 = i + add x = A[u1][u2] A[u1][u2] += x A[u2][u3] += x A[u3][u4] += x A[u4][u1] += x A[u2][u1] -= x A[u3][u2] -= x A[u4][u3] -= x A[u1][u4] -= x for row in A: print(*row) for i in range(1 << n): for j in range(1 << n): if bin(i ^ j).count("1") == 1: assert A[i][j] != 0 else: assert A[i][j] == 0 assert A[i][j] == -A[j][i] assert sum(A[i]) == 0 solve(int(input()))