import sys read = sys.stdin.buffer.read readline = sys.stdin.buffer.readline readlines = sys.stdin.buffer.readlines # -1: 未使用 # -2:次数2 # それ以外:パスのもうひとつの端点を持つ def solve(N): from collections import defaultdict N += 2 def add_edge(A, u, v, k): # A[i] が i+k を指す # -1: 異常終了、0:正常終了、1:サイクルを見つけて正常終了 if A[u - k] == -2 or A[v - k] == -2: return -1 if A[u - k] == A[v - k] == -1: # 新しい成分 A[u - k] = v A[v - k] = u return 0 if A[v - k] == -1: u, v = v, u if A[u - k] == -1: w = A[v - k] A[w - k] = u A[u - k] = w A[v - k] = -2 return 0 w1, w2 = A[u - k], A[v - k] if w1 == v: A[u - k] = A[v - k] = -2 return 1 A[u - k] = A[v - k] = -2 A[w1 - k] = w2 A[w2 - k] = w1 return 0 def can_use(v): row, col = divmod(v, N) return 1 <= col <= row init = (-1, ) * (N + 2) dp = defaultdict(int) dp[init] = 1 ret = 0 for n in range(N + 1, N**2): omit = n - N - 1 print(N - 2, n, ret, len(dp)) row, col = divmod(n, N) for dx in [1, N, N + 1]: newdp = dp.copy() for A, cnt in dp.items(): B = list(A) assert n + 1 - len(B) == omit if not (can_use(n) and can_use(n - dx)): continue t = add_edge(B, n, n - dx, omit) if t == -1: continue if t == 1: cycle = True if any(x >= 0 for x in B): continue ret += cnt continue newdp[tuple(B)] += cnt dp = newdp newdp = defaultdict(int) for A, cnt in dp.items(): # 今後回収できない端点 if A[0] >= 0: continue newdp[A[1:] + (-1, )] += cnt dp = newdp return ret A = [ 1, 1, 11, 110, 2402, 128967, 16767653, 5436906668, 4406952731948, 8819634719356421, 43329348004927734247, 522235268182347360718818, 15436131339319739257518081878 ] N = int(read()) print(A[N])