One day, $n$ people ($n$ is an even number) met on a plaza and made two round dances, each round dance consists of exactly $\frac{n}{2}$ people. Your task is to find the number of ways $n$ people can make two round dances if each round dance consists of exactly $\frac{n}{2}$ people. Each person should belong to exactly one of these two round dances.

Round dance is a dance circle consisting of $1$ or more people. Two round dances are indistinguishable (equal) if one can be transformed to another by choosing the first participant. For example, round dances $[1, 3, 4, 2]$, $[4, 2, 1, 3]$ and $[2, 1, 3, 4]$ are indistinguishable.

For example, if $n=2$ then the number of ways is $1$: one round dance consists of the first person and the second one of the second person.

For example, if $n=4$ then the number of ways is $3$. Possible options:  one round dance — $[1,2]$, another — $[3,4]$;  one round dance — $[2,4]$, another — $[3,1]$;  one round dance — $[4,1]$, another — $[3,2]$. 

Your task is to find the number of ways $n$ people can make two round dances if each round dance consists of exactly $\frac{n}{2}$ people.


-----Input-----

The input contains one integer $n$ ($2 \le n \le 20$), $n$ is an even number.


-----Output-----

Print one integer — the number of ways to make two round dances. It is guaranteed that the answer fits in the $64$-bit integer data type.


-----Examples-----
Input
2

Output
1

Input
4

Output
3

Input
8

Output
1260

Input
20

Output
12164510040883200

Difficulty: EASY

Solutions:
import math
n = int(input())
half = n // 2
rotations = half
res = math.factorial(n - 1) // half
print(res)


N = int(input())
fact = [1 for i in range(N + 1)]
for i in range(2, N + 1):
	fact[i] = i * fact[i - 1]
print(fact[N] * 2 // N // N)


from math import *
n = int(input())
ans = comb(n, n // 2) // 2
ans *= factorial(n // 2 - 1) ** 2
print(ans)


from math import factorial
n = int(input())
ans = 0
print(factorial(n) // factorial(n // 2) ** 2 * factorial(n // 2 - 1) ** 2 // 2)


r = [0, 0, 1, 0, 3, 0, 40, 0, 1260, 0, 72576, 0, 6652800, 0, 889574400, 0, 163459296000, 0, 39520825344000, 0, 12164510040883200]
print(r[int(input())])


from math import *
n = int(input())
k = factorial(n - 1)
p = n // 2
print(k // p)


import sys

def main():
	fact = list(range(0, 21))
	fact[0] = 1
	for i in range(1, 21):
		fact[i] *= fact[i - 1]
	n = Iint()
	s = n // 2
	ans = fact[n] // fact[s] ** 2
	ans *= fact[n // 2 - 1] ** 2
	print(ans // 2)
en = enumerate
FIO = 10

def debug(*args, c=6):
	pass
	print('\x1b[3{}m'.format(c), *args, '\x1b[0m', file=sys.stderr)
BUFSIZE = 8 * 1024

def Istr():
	return input()

def Iint():
	return int(input())

def Ilist():
	return list(map(int, input().split()))

def Imap():
	return map(int, input().split())

def Plist(li, s=' '):
	print(s.join(map(str, li)))
if not FIO:
	if __name__ == '__main__':
		main()
		exit()
else:
	from io import BytesIO, IOBase
	import os

class FastIO(IOBase):
	newlines = 0

	def __init__(self, file):
		self._fd = file.fileno()
		self.buffer = BytesIO()
		self.writable = 'x' in file.mode or 'r' not in file.mode
		self.write = self.buffer.write if self.writable else None

	def read(self):
		while True:
			b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
			if not b:
				break
			ptr = self.buffer.tell()
			(self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
		self.newlines = 0
		return self.buffer.read()

	def readline(self):
		while self.newlines == 0:
			b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
			self.newlines = b.count(b'\n') + (not b)
			ptr = self.buffer.tell()
			(self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
		self.newlines -= 1
		return self.buffer.readline()

	def flush(self):
		if self.writable:
			os.write(self._fd, self.buffer.getvalue())
			(self.buffer.truncate(0), self.buffer.seek(0))

class IOWrapper(IOBase):

	def __init__(self, file):
		self.buffer = FastIO(file)
		self.flush = self.buffer.flush
		self.writable = self.buffer.writable
		self.write = lambda s: self.buffer.write(s.encode('ascii'))
		self.read = lambda : self.buffer.read().decode('ascii')
		self.readline = lambda : self.buffer.readline().decode('ascii')
(sys.stdin, sys.stdout) = (IOWrapper(sys.stdin), IOWrapper(sys.stdout))

def input():
	return sys.stdin.readline().rstrip('\r\n')
main()


def factor(x):
	if x <= 1:
		return 1
	else:
		return x * factor(x - 1)

def C(n, m):
	if m == 0:
		return 1
	return factor(n) / factor(n - m) / factor(m)
n = int(input())
print(int(C(n, n // 2) * factor(n // 2 - 1) ** 2 / 2))


def factorial(n):
	if n == 1 or n == 0:
		return 1
	return n * factorial(n - 1)
num = int(input())
print(factorial(num) // factorial(num // 2) ** 2 * factorial(num // 2 - 1) ** 2 // 2)


def main():
	n = int(input())
	half = n // 2
	fac = 1
	for i in range(half):
		fac *= n - i
		fac //= i + 1
	fac //= 2
	fac2 = 1
	for i in range(1, half):
		fac2 *= i
	print(fac * fac2 * fac2)
main()


import sys
import math
import time
from functools import lru_cache
from collections import Counter
import heapq

def Update(X, AX, BX, CX, DX, k, n):
	for i in range(k, n):
		tem = (AX * X[i - 2] + BX * X[i - 1] + CX) % DX + 1
		X.append(tem)
try:
	for _ in range(1):
		n = int(input())
		x = math.factorial(n - 1)
		print(x // (n // 2))
except EOFError as e:
	print(e)


from sys import stdin, stdout
from os import path
if path.exists('input.txt'):
	stdin = open('input.txt', 'r')
x = int(stdin.readline())
arr = [1]
for i in range(1, x):
	arr.append(arr[i - 1] * (i + 1))
a = arr[x - 1]
b = x // 2
b *= b * 2
a //= b
stdout.write(str(a))


ss = 1
n = int(input())
n = n // 2 - 1
for i in range(2, 2 * n + 2):
	ss *= i
print(ss // (n + 1))


n = int(input())

def f(n):
	if n == 1:
		return 1
	else:
		return n * f(n - 1)
a = f(n)
b = f(n // 2)
c = b // (n // 2)
a = a // b
a = a // b
a *= c
a *= c
a //= 2
print(a)


def fact(n):
	if n == 0:
		return 1
	return n * fact(n - 1)
n = int(input())
print(fact(n) // (2 * (n // 2) * (n // 2)))


n = int(input())
from math import factorial as fact
print(fact(n - 1) // (n // 2))


MOD = 1000000007
ii = lambda : int(input())
si = lambda : input()
dgl = lambda : list(map(int, input()))
f = lambda : map(int, input().split())
il = lambda : list(map(int, input().split()))
ls = lambda : list(input())
from collections import *
n = ii()
s = 1
for i in range(1, n):
	s = s * i
print(s // (n // 2))


from math import log2, factorial as f
n = int(input())
ans = int(f(n) / (n * (n // 2)))
print(ans)


from sys import stdout, stdin
from collections import defaultdict, deque
import math
n = int(stdin.readline())
l = [1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800, 39916800, 479001600, 6227020800, 87178291200, 1307674368000, 20922789888000, 355687428096000, 6402373705728000, 121645100408832000]
k = n // 2
print(l[n - 1] // k)


def ncr(a, b):
	if a == b:
		return 1
	if b == 0 or a == 1:
		return 1
	return ncr(a - 1, b - 1) + ncr(a - 1, b)
n = int(input())
m = n // 2
ans = 1
for i in range(1, m):
	ans *= i
ans *= ans
ans *= ncr(n, m)
print(ans // 2)


n = int(input())
ans = n
m = n // 2
for i in range(n - 1, 1, -1):
	ans *= i
print(ans // (n * m))


from math import factorial
n = int(input())
print(int(factorial(n) / (factorial(n) / factorial(n - 1) * (n // 2))))


def c(n, r):
	return f(n) / (f(r) * f(n - r))

def f(n):
	p = 1
	for i in range(1, n + 1):
		p = p * i
	return p
n = int(input())
print(int(f(int(n / 2) - 1) ** 2 * c(n - 1, int(n / 2) - 1)))


N = int(input())
fatorial = 1
for i in range(2, N + 1):
	fatorial *= i
a = fatorial // (N // 2)
b = a // (N // 2)
c = b // 2
print(c)


def mi():
	return map(int, input().split())
a = [1, 1, 1, 3, 8, 40, 180, 1260, 8064, 72576, 604800, 6652800, 68428800, 889574400, 10897286400, 163459296000, 2324754432000, 39520825344000, 640237370572800, 12164510040883200, 221172909834240000, 4644631106519040000, 93666727314800640000]
print(a[int(input()) - 1])


import os
import sys
from math import *
from collections import *
from heapq import *
from bisect import *
from io import BytesIO, IOBase

def vsInput():
	sys.stdin = open('input.txt', 'r')
	sys.stdout = open('output.txt', 'w')
BUFSIZE = 8192

class FastIO(IOBase):
	newlines = 0

	def __init__(self, file):
		self._fd = file.fileno()
		self.buffer = BytesIO()
		self.writable = 'x' in file.mode or 'r' not in file.mode
		self.write = self.buffer.write if self.writable else None

	def read(self):
		while True:
			b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
			if not b:
				break
			ptr = self.buffer.tell()
			(self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
		self.newlines = 0
		return self.buffer.read()

	def readline(self):
		while self.newlines == 0:
			b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
			self.newlines = b.count(b'\n') + (not b)
			ptr = self.buffer.tell()
			(self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
		self.newlines -= 1
		return self.buffer.readline()

	def flush(self):
		if self.writable:
			os.write(self._fd, self.buffer.getvalue())
			(self.buffer.truncate(0), self.buffer.seek(0))

class IOWrapper(IOBase):

	def __init__(self, file):
		self.buffer = FastIO(file)
		self.flush = self.buffer.flush
		self.writable = self.buffer.writable
		self.write = lambda s: self.buffer.write(s.encode('ascii'))
		self.read = lambda : self.buffer.read().decode('ascii')
		self.readline = lambda : self.buffer.readline().decode('ascii')
(sys.stdin, sys.stdout) = (IOWrapper(sys.stdin), IOWrapper(sys.stdout))
input = lambda : sys.stdin.readline().rstrip('\r\n')
ALPHA = 'abcdefghijklmnopqrstuvwxyz/'
M = 1000000007
EPS = 1e-06

def Ceil(a, b):
	return a // b + int(a % b > 0)

def value():
	return tuple(map(int, input().split()))

def array():
	return [int(i) for i in input().split()]

def Int():
	return int(input())

def Str():
	return input()

def arrayS():
	return [i for i in input().split()]

def nCr(n, r):
	(p, k) = (1, 1)
	r = min(n - r, r)
	if r != 0:
		while r:
			p *= n
			k *= r
			m = gcd(p, k)
			p //= m
			k //= m
			n -= 1
			r -= 1
	else:
		p = 1
	return p
for _ in range(1):
	n = Int()
	ans = nCr(n, n // 2) // 2
	ans *= factorial(n // 2 - 1) ** 2
	print(ans)


a = int(input())
b = 1
g = a / 2
for i in range(2, a):
	b = b * i
print(int(b / g))


import math
a = int(input())
print(math.factorial(a - 1) // (a // 2))


import sys
import math as m

def main():
	pass

def binary(n):
	return bin(n).replace('0b', '')

def decimal(s):
	return int(s, 2)

def pow2(n):
	p = 0
	while n > 1:
		n //= 2
		p += 1
	return p

def isPrime(n):
	if n == 1:
		return False
	else:
		root = int(n ** 0.5)
		root += 1
		for i in range(2, root):
			if n % i == 0:
				return False
		return True

def lts(l):
	s = ''.join(map(str, l))
	return s

def stl(s):
	l = list(s)
	return l

def sq(a, target, arr=[]):
	s = sum(arr)
	if s == target:
		return arr
	if s >= target:
		return
	for i in range(len(a)):
		n = a[i]
		remaining = a[i + 1:]
		ans = sq(remaining, target, arr + [n])
		if ans:
			return ans
mod = int(1000000000.0) + 7

def sinp():
	return sys.stdin.readline().strip()

def iinp():
	return int(input())

def ninp():
	return map(int, sys.stdin.readline().strip().split())

def llinp():
	return list(map(int, sys.stdin.readline().strip().split()))

def p(xyz):
	print(xyz)

def p2(a, b):
	print(a, b)
n = iinp()
if n == 2:
	print(1)
else:
	print(2 * m.factorial(n) // (n * n))


inp = lambda : int(input())
strl = lambda : list(input().strip())
seq = lambda : list(map(int, input().strip().split()))

def f(n):
	ans = 1
	for i in range(1, n):
		ans *= i
	return ans * 2 // n

def main():
	print(f(inp()))
main()


import math

def doit(n, r):
	nume = math.factorial(n)
	deno = n * (n // 2)
	return nume // deno
n = int(input())
print(doit(n, n // 2))


def opt1(n):
	k = n // 2
	res = 1
	for i in range(k + 1, n + 1):
		res *= i
	for i in range(2, k + 1):
		res //= i
	return res

def opt2(n):
	res = 1
	for i in range(1, n + 1):
		res *= i
	if n == 1:
		return 1
	if n == 2:
		return 1
	return res // n
n = int(input())
print(opt1(n) * opt2(n // 2) * opt2(n // 2) // 2)


import sys
import math
input = sys.stdin.readline

def inp():
	return int(input())

def inara():
	return list(map(int, input().split()))

def insr():
	s = input()
	return list(s[:len(s) - 1])

def invr():
	return map(int, input().split())

def fact(n):
	if n == 0:
		return 1
	return n * fact(n - 1)

def C(n, r):
	return fact(n) // (fact(n - r) * fact(r))
n = inp()
ans = C(n, n // 2) * fact(n // 2) ** 2
print(ans // (n * n // 2))


import math
import string
import random
from random import randrange
from collections import deque
from collections import defaultdict

def solve(n):
	ans = 1
	n2 = 1
	for i in range(1, n // 2 + 1):
		n2 *= i
	nf = 1
	for i in range(1, n + 1):
		nf *= i
	ans = nf // n2
	ans = ans // n2
	ans = ans // 2
	ans = ans * (n2 / (n // 2)) ** 2
	print(int(ans))
	return

def main():
	n = int(input())
	solve(n)
	return

def test():
	arr_size = 25
	test_cases = 100
	min_range = -100
	max_range = 100
	str_size = 30
	step = 1
	for i in range(test_cases):
		k = []
		for j in range(arr_size):
			num = randrange(min_range, max_range, step)
			k.append(num)
		solve(n, arr)
		print('<-------- DEBUG ----------->')
	return
main()


fact = [1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800, 39916800, 479001600, 6227020800, 87178291200, 1307674368000, 20922789888000, 355687428096000, 6402373705728000, 121645100408832000, 2432902008176640000]

def testcase():
	n = int(input())
	ans = fact[n] // (2 * fact[n // 2] ** 2) * fact[n // 2 - 1] ** 2
	print(ans)
	return
import sys, os
if os.path.exists('input.txt'):
	sys.stdin = open('input.txt', 'r')
testcase()


n = int(input())

def fact(n):
	res = 1
	for i in range(2, n + 1):
		res *= i
	return res

def ncr(n):
	return fact(n) // pow(fact(n // 2), 2)
print(ncr(n) * pow(fact(n // 2 - 1), 2) // 2)


import math
n = int(input())
p1 = math.factorial(n - 1) // math.factorial(n // 2)
p2 = math.factorial(n // 2 - 1)
print(p1 * p2)


n = int(input())
m = n // 2
a = 1
for i in range(n, n - m, -1):
	a *= i
b = 1
for i in range(1, m + 1):
	b *= i
print(a * b // (2 * m * m))


def fat(n):
	ris = 1
	for x in range(2, n + 1):
		ris *= x
	return ris
n = int(input())
print(fat(n) // (n * (n // 2)))


n = int(input())
if n == 2:
	print(1)
	exit()
import math
ans = math.factorial(n) // (math.factorial(n // 2) * math.factorial(n // 2)) // 2
if n // 2 != 2:
	ans *= math.factorial(n // 2 - 1)
	ans *= math.factorial(n // 2 - 1)
print(ans)


import math
n = int(input())
res = 2 * math.factorial(n - 1) // n
print(res)


import sys, io, os, time
from collections import defaultdict
from collections import Counter
from collections import deque
from itertools import combinations
from itertools import permutations
import bisect, math, heapq
alphabet = 'abcdefghijklmnopqrstuvwxyz'
input = sys.stdin.readline
arr = [1, 3, 40, 1260, 72576, 6652800, 889574400, 163459296000, 39520825344000, 12164510040883200, 4644631106519040000, 2154334728240414720000, 1193170003333152768000000, 777776389315596582912000000]
n = int(input())
print(arr[n // 2 - 1])


import math

def round_dances():
	dance = int(input())
	print(int(math.factorial(dance) / (dance * dance / 2)))
round_dances()


n = int(input())
fac = [1]
for i in range(1, 21):
	fac.append(fac[-1] * i)
ans = fac[n] // (fac[n // 2] * fac[n // 2]) * fac[n // 2 - 1] ** 2 // 2
if n == 2:
	print(1)
else:
	print(int(ans))


from math import factorial
N = int(input())
print(int(factorial(N - 1) / (N / 2)))


ns = lambda : input()
ni = lambda : int(input())
nm = lambda : map(int, input().split())
nl = lambda : list(map(int, input().split()))

def fac(a):
	if a < 2:
		return 1
	n = 1
	for i in range(2, a + 1):
		n *= i
	return n
n = ni()
t = d = 1
for i in range(1, n // 2 + 1):
	d *= i
for i in range(n // 2 + 1, n + 1):
	t *= i
ans = t // d // 2
q = fac(n // 2 - 1)
print(ans * q * q)


import math
n = int(input())
nn = int(n / 2)
res = int(math.comb(n, nn) * math.factorial(nn) ** 2 / (2 * nn ** 2))
print(res)


n = int(input())
x = 1
for i in range(1, n):
	x = x * i
ans = x * 2 // n
print(ans)


d = {2: 1, 4: 3, 6: 40, 8: 1260, 10: 72576, 12: 6652800, 14: 889574400, 16: 163459296000, 18: 39520825344000, 20: 12164510040883200}
x = int(input())
print(d[x])


n = int(input())
k1 = 1
k2 = 1
for i in range(n // 2 + 1, n + 1):
	k1 *= i
k1 //= n // 2
for i in range(1, n // 2 + 1):
	k2 *= i
k2 //= n // 2
print(k1 * k2 // 2)


def s():
	res = [1, 1, 3, 40, 1260, 72576, 6652800, 889574400, 163459296000, 39520825344000, 12164510040883200]
	print(res[int(input()) // 2])
s()


n = int(input())
fact = [1]
for i in range(1, 22):
	fact.append(fact[-1] * i)
cnk = fact[n] // (fact[n // 2] * fact[n // 2]) // 2
print((fact[n // 2] // (n // 2)) ** 2 * cnk)


n = int(input())
t = 1
for i in range(n):
	t *= i + 1
print(t // (n * n // 2))


import math
n = int(input())
a = math.factorial(n)
b = math.factorial(n // 2)
c = math.factorial(n // 2 - 1)
ans = a // (b * b)
ans = ans // 2
print(ans * c * c)


x = int(input())
y = x // 2
nomi = 1
for i in range(x):
	nomi *= i + 1
print(nomi // (2 * y ** 2))


import math
n = int(input())
if n == 2:
	print(1)
else:
	print(2 * math.factorial(n) // (n * n))


from math import factorial as f
n = int(input())
print(int(f(n) / (f(max(n // 2, 1)) * f(max(n // 2, 1))) * f(max(n // 2 - 1, 1)) * f(max(n // 2 - 1, 1)) * (1 / 2)))


from math import factorial
n = int(input())
a = [0, 1, 3, 40, 1260, 72576, 6652800, 889574400, 163459296000, 39520825344000, 12164510040883200]
print(a[n // 2])


import sys
import os
from io import BytesIO, IOBase

def cel(a, b):
	return (a + b - 1) // b

def ii():
	return int(input())

def mi():
	return map(int, input().split())

def li():
	return list(map(int, input().split()))

def lcm(a, b):
	return abs(a * b) // gcd(a, b)

def prr(a, sep=' '):
	print(sep.join(map(str, a)))

def ddi():
	return defaultdict(int)

def ddl():
	return defaultdict(list)

def ddd():
	return defaultdict(defaultdict(int))
BUFSIZE = 8192

class FastIO(IOBase):
	newlines = 0

	def __init__(self, file):
		self._fd = file.fileno()
		self.buffer = BytesIO()
		self.writable = 'x' in file.mode or 'r' not in file.mode
		self.write = self.buffer.write if self.writable else None

	def read(self):
		while True:
			b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
			if not b:
				break
			ptr = self.buffer.tell()
			(self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
		self.newlines = 0
		return self.buffer.read()

	def readline(self):
		while self.newlines == 0:
			b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
			self.newlines = b.count(b'\n') + (not b)
			ptr = self.buffer.tell()
			(self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
		self.newlines -= 1
		return self.buffer.readline()

	def flush(self):
		if self.writable:
			os.write(self._fd, self.buffer.getvalue())
			(self.buffer.truncate(0), self.buffer.seek(0))

class IOWrapper(IOBase):

	def __init__(self, file):
		self.buffer = FastIO(file)
		self.flush = self.buffer.flush
		self.writable = self.buffer.writable
		self.write = lambda s: self.buffer.write(s.encode('ascii'))
		self.read = lambda : self.buffer.read().decode('ascii')
		self.readline = lambda : self.buffer.readline().decode('ascii')
(sys.stdin, sys.stdout) = (IOWrapper(sys.stdin), IOWrapper(sys.stdout))
input = lambda : sys.stdin.readline().rstrip('\r\n')
from collections import defaultdict
from math import gcd, pi, inf
from heapq import *
from math import factorial
n = ii()
res = factorial(n) // factorial(n // 2) ** 2 // 2 * factorial(n // 2 - 1) ** 2
print(res)


n = int(input())
m = n // 2
f = 1
for i in range(1, n + 1):
	f *= i
m = 2 * m * m
print(f // m)


from math import *
from collections import deque
from copy import deepcopy
import sys

def inp():
	return sys.stdin.readline().rstrip('\r\n')

def multi():
	return map(int, input().split())

def strmulti():
	return map(str, inp().split())

def lis():
	return list(map(int, inp().split()))

def lcm(a, b):
	return a * b // gcd(a, b)

def ncr(n, r):
	return factorial(n) // (factorial(r) * factorial(max(n - r, 1)))

def stringlis():
	return list(map(str, inp().split()))

def out(var):
	sys.stdout.write(str(var))

def printlist(a):
	print(' '.join((str(a[i]) for i in range(len(a)))))

def isPrime(n):
	if n <= 1:
		return False
	if n <= 3:
		return True
	if n % 2 == 0 or n % 3 == 0:
		return False
	i = 5
	while i * i <= n:
		if n % i == 0 or n % (i + 2) == 0:
			return False
		i = i + 6
	return True
n = int(input())
ans = ncr(n, n // 2) * factorial(n // 2 - 1) ** 2
ans //= 2
print(ans)


def nCr(n, r):
	return fact(n) / (fact(r) * fact(n - r))

def fact(n):
	res = 1
	for i in range(2, int(n) + 1):
		res = res * i
	return res
n = int(input())
if n == 2:
	print(1)
else:
	num = n / 2 - 1
	ans = 1 / 2 * nCr(n, n / 2) * fact(n / 2 - 1) * fact(n / 2 - 1)
	print(int(ans))


n = int(input())
ncr = 1
for i in range(n // 2 + 1, n + 1):
	ncr = ncr * i
for i in range(1, n // 2 + 1):
	ncr = ncr // i
ans = ncr // 2
fmul = 1
for i in range(1, n // 2):
	fmul = fmul * i
ans = ans * fmul
ans = ans * fmul
ans = int(ans)
print(ans)


n = int(input())

def fatorial(n):
	fact = 1
	for num in range(2, n + 1):
		fact *= num
	return fact
Val = fatorial(n - 1) // (n // 2)
print(Val)


def fact(n):
	ans = 1
	for i in range(2, n + 1):
		ans *= i
	return ans
n = int(input())
print(fact(n) // (n // 2) // (n // 2) // 2)


import os
import sys
from io import BytesIO, IOBase
import threading
from bisect import bisect_right
from math import gcd, log
from collections import Counter
from pprint import pprint
from itertools import combinations

def main():
	n = int(input())
	ans = 1
	dev = 1
	for i in range(n // 2 + 1, n + 1):
		ans = ans * i
		dev *= i - n // 2
	ans //= dev
	ans //= 2
	w = 1
	for i in range(1, n // 2):
		w *= i
	print(ans * w * w)
BUFSIZE = 8192

class FastIO(IOBase):
	newlines = 0

	def __init__(self, file):
		self._fd = file.fileno()
		self.buffer = BytesIO()
		self.writable = 'x' in file.mode or 'r' not in file.mode
		self.write = self.buffer.write if self.writable else None

	def read(self):
		while True:
			b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
			if not b:
				break
			ptr = self.buffer.tell()
			(self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
		self.newlines = 0
		return self.buffer.read()

	def readline(self):
		while self.newlines == 0:
			b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
			self.newlines = b.count(b'\n') + (not b)
			ptr = self.buffer.tell()
			(self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
		self.newlines -= 1
		return self.buffer.readline()

	def flush(self):
		if self.writable:
			os.write(self._fd, self.buffer.getvalue())
			(self.buffer.truncate(0), self.buffer.seek(0))

class IOWrapper(IOBase):

	def __init__(self, file):
		self.buffer = FastIO(file)
		self.flush = self.buffer.flush
		self.writable = self.buffer.writable
		self.write = lambda s: self.buffer.write(s.encode('ascii'))
		self.read = lambda : self.buffer.read().decode('ascii')
		self.readline = lambda : self.buffer.readline().decode('ascii')
(sys.stdin, sys.stdout) = (IOWrapper(sys.stdin), IOWrapper(sys.stdout))
input = lambda : sys.stdin.readline().rstrip('\r\n')
for _ in range(1):
	main()


n = int(input())

def factorial(num):
	if num == 0 or num == 1:
		return 1
	return num * factorial(num - 1)
ans = 1
for i in range(1, n // 2):
	ans *= n - i
print(ans * factorial(n // 2 - 1))


n = int(input())
fact = [1]
for i in range(1, 21):
	fact.append(fact[-1] * i)
ans = fact[n] / fact[n // 2]
ans //= fact[n // 2]
ans //= 2
ans *= fact[n // 2 - 1] ** 2
ans = str(int(ans))
print(ans)


import math
n = int(input())
gm = n // 2
gr = math.factorial(n) // (math.factorial(gm) * math.factorial(gm) * 2)
gc = math.factorial(gm) // gm * (math.factorial(gm) // gm)
r = gr * gc
print(r)


from functools import reduce

def read_int() -> int:
	return int(input())

def read_ints():
	return map(int, input().split(' '))

def factorial(n: int) -> int:
	return reduce(lambda x, y: x * y, range(2, n + 1), 1)

def test_case():
	n = read_int()
	print(factorial(n) // (n * n // 2))
test_case()


import sys
from collections import defaultdict
input = sys.stdin.readline
from math import factorial
n = int(input())
print(factorial(n) // (n * (n // 2)))


from math import factorial

def binomial(n, k):
	return factorial(n) // factorial(k) // factorial(n - k)
m = int(input())
print(binomial(m, m // 2) // 2 * factorial(m // 2 - 1) ** 2)


a = int(input())
b = 1
for i in range(a + 1):
	if i > 0:
		b *= i
print(b // (a * (a // 2)))


import math
n = int(input())
a = math.factorial(n)
b = (n // 2) ** 2
c = a // (2 * b)
print(c)


n = int(input())
product = 1
for i in range(1, n + 1):
	product = product * i
print(2 * product // (n * n))


import math
import sys

def input():
	return sys.stdin.buffer.readline()[:-1]
n = int(input())
x = 1
y = 1
for i in range(1, n // 2 + 1):
	x *= i
for i in range(n // 2 + 1, n + 1):
	y *= i
z = y // x
t = 1
for i in range(1, n // 2):
	t *= i
t *= t
print(z * t // 2)


import os
import sys
import math
import collections

def get_int():
	return int(input())

def get_ints():
	return map(int, input().split())

def get_strs():
	return input().split()

def get_float():
	return float(input())

def get_floats():
	return map(float, input().split())

def list_strs():
	return list(input().split())

def list_ints():
	return list(map(int, input().split()))

def list_floats():
	return list(map(float, input.split()))

def post(x):
	print(x, end=' ')
n = get_int()
res = math.factorial(n - 1) / ((n + 1) // 2)
print(int(res))


def factorial(x):
	if x == 1:
		return 1
	else:
		return x * factorial(x - 1)
n = int(input())
r = factorial(n - 1)
d = n // 2
print(r // d)


def fact(n):
	facto = 1
	m = n
	while m > 0:
		facto = facto * m
		m -= 1
	return facto
n = int(input())
if n % 2 == 0 and n >= 2 and (n <= 20):
	l = fact(n) / (2 * pow(fact(n / 2), 2)) * pow(fact(n / 2 - 1), 2)
	print(int(l))


from __future__ import division, print_function
import bisect
import math
import heapq
import itertools
import sys
from collections import deque
from atexit import register
from collections import Counter
from functools import reduce
if sys.version_info[0] < 3:
	from io import BytesIO as stream
else:
	from io import StringIO as stream
if sys.version_info[0] < 3:

	class dict(dict):

		def items(self):
			return dict.iteritems(self)

		def keys(self):
			return dict.iterkeys(self)

		def values(self):
			return dict.itervalues(self)
	input = raw_input
	range = xrange
	filter = itertools.ifilter
	map = itertools.imap
	zip = itertools.izip

def sync_with_stdio(sync=True):
	global input, flush
	if sync:
		flush = sys.stdout.flush
	else:
		sys.stdin = stream(sys.stdin.read())
		input = lambda : sys.stdin.readline().rstrip('\r\n')
		sys.stdout = stream()
		register(lambda : sys.__stdout__.write(sys.stdout.getvalue()))

def main():
	lol = [1, 3, 40, 1260, 72576, 6652800, 889574400, 163459296000, 39520825344000, 12164510040883200]
	n = int(input())
	n //= 2
	print(lol[n - 1])
main()


from math import factorial as fct
n = int(input())

def cnk(n, k):
	return fct(n) // fct(k) // fct(n - k)
h = n // 2
print(cnk(n, n // 2) * fct(h - 1) ** 2 // 2)


def fat(n):
	if n == 0 or n == 1:
		return 1
	return n * fat(n - 1)
n = int(input())
aux = fat(n) / (n * (n / 2))
print(int(aux))


n = int(input())
f = [1]
for i in range(1, 21):
	f.append(f[-1] * i)
print(f[n] * f[n // 2 - 1] ** 2 // (2 * f[n // 2] ** 2))


n = int(input())
c = n * n
x = n // 2
(i, a, b, c) = (1, 1, 1, 1)
while i <= x:
	a *= n
	n -= 1
	b *= i
	i += 1
ans = 2 * a * b
c = ((i - 1) * 2) ** 2
ans1 = ans // c
print(ans1)


def cal(k):
	ans = 1
	for i in range(k + 1, 2 * k):
		ans *= i
	for i in range(1, k):
		ans //= i
	t = 1
	for i in range(1, k):
		t *= i
	ans *= t * t
	return ans
print(cal(int(input()) // 2))


n = int(input())
a = [0, 1, 3, 40, 1260, 72576, 6652800, 889574400, 163459296000, 39520825344000, 12164510040883200]
print(a[n // 2])


n = m = int(input())
r = 2
while m > 1:
	m -= 1
	r *= m
print(r // n)


x = int(input())
v = 1
for i in range(2, x + 1):
	v *= i
v //= x
v //= x // 2
print(v)


from __future__ import division, print_function
from fractions import Fraction
import sys
import os
from io import BytesIO, IOBase
from itertools import *
import bisect
from heapq import *
from math import ceil, floor
from copy import *
from collections import deque, defaultdict
from collections import Counter as counter
from itertools import combinations
from itertools import permutations as permutate
from bisect import bisect_left as bl
from operator import *
from bisect import bisect_right as br
from bisect import bisect
BUFSIZE = 8192
from sys import stderr

class FastIO(IOBase):
	newlines = 0

	def __init__(self, file):
		self._fd = file.fileno()
		self.buffer = BytesIO()
		self.writable = 'x' in file.mode or 'r' not in file.mode
		self.write = self.buffer.write if self.writable else None

	def read(self):
		while True:
			b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
			if not b:
				break
			ptr = self.buffer.tell()
			(self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
		self.newlines = 0
		return self.buffer.read()

	def readline(self):
		while self.newlines == 0:
			b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
			self.newlines = b.count(b'\n') + (not b)
			ptr = self.buffer.tell()
			(self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
		self.newlines -= 1
		return self.buffer.readline()

	def flush(self):
		if self.writable:
			os.write(self._fd, self.buffer.getvalue())
			(self.buffer.truncate(0), self.buffer.seek(0))

class IOWrapper(IOBase):

	def __init__(self, file):
		self.buffer = FastIO(file)
		self.flush = self.buffer.flush
		self.writable = self.buffer.writable
		self.write = lambda s: self.buffer.write(s.encode('ascii'))
		self.read = lambda : self.buffer.read().decode('ascii')
		self.readline = lambda : self.buffer.readline().decode('ascii')

def print(*args, **kwargs):
	(sep, file) = (kwargs.pop('sep', ' '), kwargs.pop('file', sys.stdout))
	at_start = True
	for x in args:
		if not at_start:
			file.write(sep)
		file.write(str(x))
		at_start = False
	file.write(kwargs.pop('end', '\n'))
	if kwargs.pop('flush', False):
		file.flush()
if sys.version_info[0] < 3:
	(sys.stdin, sys.stdout) = (FastIO(sys.stdin), FastIO(sys.stdout))
else:
	(sys.stdin, sys.stdout) = (IOWrapper(sys.stdin), IOWrapper(sys.stdout))
from types import GeneratorType

def iterative(f, stack=[]):

	def wrapped_func(*args, **kwargs):
		if stack:
			return f(*args, **kwargs)
		to = f(*args, **kwargs)
		while True:
			if type(to) is GeneratorType:
				stack.append(to)
				to = next(to)
				continue
			stack.pop()
			if not stack:
				break
			to = stack[-1].send(to)
		return to
	return wrapped_func
mod = 1000000007

def inp():
	return sys.stdin.readline().rstrip('\r\n')

def out(var):
	sys.stdout.write(str(var))

def lis():
	return list(map(int, inp().split()))

def stringlis():
	return list(map(str, inp().split()))

def sep():
	return map(int, inp().split())

def strsep():
	return map(str, inp().split())

def fsep():
	return map(float, inp().split())

def nextline():
	out('\n')

def testcase(t):
	for p in range(t):
		solve()

def pow(x, y, p):
	res = 1
	x = x % p
	if x == 0:
		return 0
	while y > 0:
		if y & 1 == 1:
			res = res * x % p
		y = y >> 1
		x = x * x % p
	return res
from functools import reduce

def factors(n):
	return set(reduce(list.__add__, ([i, n // i] for i in range(1, int(n ** 0.5) + 1) if n % i == 0)))

def gcd(a, b):
	if a == b:
		return a
	while b > 0:
		(a, b) = (b, a % b)
	return a

def comb(n, r):
	if n < r:
		return 0
	else:
		return fac[n] * (finv[r] * finv[n - r] % mod) % mod

def prefix_sum(ar):
	return list(accumulate(ar))

def suffix_sum(ar):
	return list(accumulate(ar[::-1]))[::-1]

def N():
	return int(inp())
from collections import defaultdict
sys.setrecursionlimit(300000)

def numberOfSetBits(i):
	i = i - (i >> 1 & 1431655765)
	i = (i & 858993459) + (i >> 2 & 858993459)
	return ((i + (i >> 4) & 252645135) * 16843009 & 4294967295) >> 24
from math import factorial as f

def solve():

	def ncr(n, r):
		return f(n) // (f(r) * f(n - r))
	n = N()
	t = ncr(n, n // 2) * f(n // 2 - 1) ** 2 // 2
	print(t)
solve()


n = int(input())
res = 1
for i in range(1, n):
	res *= i
print(int(res / (n // 2)))


n = int(input())
fi = 1
se = 1
for i in range(n, n // 2, -1):
	fi *= i
	se *= i - n / 2
fi = fi // (se * 2)
print(int(fi * (se ** 2 // (n // 2) ** 2)))


n = int(input())

def fact(x):
	if x <= 1:
		return 1
	return x * fact(x - 1)
print(2 * fact(n - 1) // n)


from collections import defaultdict, deque

def solve():
	n = int(input())
	fac_n = 1
	for i in range(1, n + 1):
		fac_n *= i
	print(fac_n // (n // 2 * n // 2) // 2)

def main():
	t = 1
	for _ in range(t):
		solve()
main()


def read_generator():
	while True:
		tokens = input().split(' ')
		for t in tokens:
			yield t
reader = read_generator()

def readword():
	return next(reader)

def readint():
	return int(next(reader))

def readfloat():
	return float(next(reader))

def readline():
	return input()

def solve(n):
	return fact(n) // (n * n // 4) // 2

def fact(n):
	f = 1
	for i in range(1, n + 1):
		f *= i
	return f
tests = 1
for t in range(tests):
	n = readint()
	print(solve(n))


import time, math as mt, bisect, sys
from sys import stdin, stdout
from collections import deque
from fractions import Fraction
from collections import Counter
from collections import OrderedDict
pi = 3.141592653589793

def II():
	return int(stdin.readline())

def IO():
	return stdin.readline()

def IP():
	return map(int, stdin.readline().split())

def L():
	return list(map(int, stdin.readline().split()))

def P(x):
	return stdout.write(str(x) + '\n')

def PI(x, y):
	return stdout.write(str(x) + ' ' + str(y) + '\n')

def lcm(a, b):
	return a * b // gcd(a, b)

def gcd(a, b):
	if a == 0:
		return b
	elif b == 0:
		return a
	if a > b:
		return gcd(a % b, b)
	else:
		return gcd(a, b % a)

def bfs(adj, v):
	visited = [False] * (v + 1)
	q = deque()
	while q:
		pass

def sieve():
	li = [True] * 1000001
	(li[0], li[1]) = (False, False)
	for i in range(2, len(li), 1):
		if li[i] == True:
			for j in range(i * i, len(li), i):
				li[j] = False
	prime = []
	for i in range(1000001):
		if li[i] == True:
			prime.append(i)
	return prime

def setBit(n):
	count = 0
	while n != 0:
		n = n & n - 1
		count += 1
	return count
mx = 10 ** 7
spf = [mx] * (mx + 1)

def SPF():
	spf[1] = 1
	for i in range(2, mx + 1):
		if spf[i] == mx:
			spf[i] = i
			for j in range(i * i, mx + 1, i):
				if i < spf[j]:
					spf[j] = i
	return

def readTree(v):
	adj = [set() for i in range(v + 1)]
	for i in range(v - 1):
		(u1, u2) = In()
		adj[u1].add(u2)
		adj[u2].add(u1)
	return adj

def nCr(n, r):
	return fact(n) / (fact(r) * fact(n - r))

def fact(n):
	res = 1
	for i in range(2, n + 1):
		res = res * i
	return res
n = II()
if n == 2:
	print(1)
elif n == 4:
	print(3)
else:
	ans = nCr(n, n // 2)
	ans = ans * fact(n // 2 - 1) * (fact(n // 2 - 1) // 2)
	print(int(ans))


import math
n = int(input())
print(math.factorial(n) // (2 * math.factorial(n // 2) ** 2) * (math.factorial(n // 2) // (n // 2)) ** 2)


n = int(input())
ans = 2
for i in range(1, n + 1):
	ans *= i
for i in range(0, 2):
	ans //= n
print(ans)


def choose(top, bottom):
	numerator = denominator = 1
	for i in range(top, top - bottom, -1):
		numerator *= i
	for j in range(1, bottom + 1):
		denominator *= j
	return numerator // denominator

def r(x):
	if x <= 2:
		return 1
	fac = 1
	for i in range(1, x):
		fac *= i
	return fac // 2 * 2

def main():
	n = int(input())
	term_1 = choose(n, n // 2) // 2
	term_2 = r(n // 2) ** 2
	print(term_1 * term_2)
main()


def fac(n):
	if n == 0:
		return 1
	else:
		return n * fac(n - 1)
n = int(input())
m = n // 2
ans = fac(n) // (2 * m ** 2)
print(ans)


from sys import stdin, stdout
input = stdin.readline
from collections import defaultdict as dd
import math

def geti():
	return map(int, input().strip().split())

def getl():
	return list(map(int, input().strip().split()))

def gets():
	return input()

def geta():
	return int(input())

def print_s(s):
	stdout.write(s + '\n')

def solve():
	n = geta()
	a = math.factorial(n // 2 - 1) ** 2
	b = math.factorial(n) // math.factorial(n // 2) ** 2
	print(a * b // 2)
solve()


n = int(input())
s = 1
for i in range(n // 2):
	s *= n - i
for i in range(n // 2):
	s //= i + 1
s //= 2
for i in range(n // 2 - 1):
	s *= i + 1
	s *= i + 1
print(s)


n = int(input())
l = []
l.append(1)
for i in range(1, n + 1):
	l.append(l[-1] * i)
ans = l[n] // (l[n // 2] * l[n - n // 2])
ans *= l[n // 2 - 1]
ans *= l[n // 2 - 1]
print(ans // 2)


def nCr(n, r):
	return fact(n) / (fact(r) * fact(n - r))

def fact(n):
	res = 1
	for i in range(2, n + 1):
		res = res * i
	return res
n = int(input())
(a, b) = (nCr(n, n // 2), fact(n // 2 - 1))
print(int(a * b * b // 2))


n = int(input())
nfac = 1
for i in range(n):
	nfac *= i + 1
divide = n * n / 2
nfac /= divide
print(int(nfac))


import sys, collections, math, itertools, random
INF = sys.maxsize

def get_ints():
	return map(int, sys.stdin.readline().strip().split())

def get_array():
	return list(map(int, sys.stdin.readline().strip().split()))

def input():
	return sys.stdin.readline().strip()
mod = 1000000007
n = int(input())
print(math.factorial(n - 1) // (n // 2))


n = int(input())

def fac(n):
	a = 1
	for i in range(1, n + 1):
		a *= i
	return a
print(fac(n - 1) // (n // 2))


def fact(n):
	count = 1
	for i in range(1, n + 1):
		count *= i
	return count
import math
a = int(input())
x = math.comb(a, a // 2)
y = fact(a // 2 - 1)
print(x * y * y // 2)


from math import factorial
n = int(input())
x = factorial(n) // factorial(n // 2) ** 2 // 2
print(x * (factorial(n // 2) // (n // 2)) ** 2)


def fac(x):
	r = 1
	for i in range(1, x + 1):
		r *= i
	return r

def C(n, m):
	if n < m:
		return 0
	return fac(n) // fac(m) // fac(n - m)
n = int(input())
print(C(n, n // 2) * fac(n // 2) // (n // 2) * fac(n // 2) // (n // 2) // 2)


def f(n):
	if n == 1:
		return 1
	else:
		return n * f(n - 1)
n = int(input()) / 2
print(int(f(2 * n) / (2 * n * n)))


import sys
import math
input = sys.stdin.readline
from collections import deque
from queue import LifoQueue

def binary_search(a, n):
	L = 0
	R = len(a) - 1
	while L <= R:
		mid = L + (R - L) // 2
		if a[mid] == n:
			return mid
		elif a[mid] < n:
			L = mid + 1
		else:
			R = mid - 1
	return -1
n = int(input())
jj = 2 * math.factorial(n)
pp = n * n
print(jj // pp)


n = int(input())
fact = 1
for i in range(1, n + 1):
	fact *= i
fact = fact // (n * n // 2)
print(fact)


def facrec(n):
	if n == 1:
		return 1
	else:
		return n * facrec(n - 1)

def choose(n):
	x = facrec(n // 2)
	y = 1
	for i in range(n, n // 2, -1):
		y *= i
	return y // x
n = int(input())
if n == 2:
	print(1)
elif n == 4:
	print(3)
else:
	ans = (facrec(n // 2 - 1) // 2) ** 2 * choose(n)
	print(2 * ans)


from math import factorial

def ncr(n, r):
	ans = 1
	for i in range(1, r + 1):
		ans = ans * (n - i + 1)
		ans = ans // i
	return ans
n = int(input())
print(ncr(n, n // 2) * factorial(n // 2 - 1) * factorial(n // 2 - 1) // 2)


def factorial(n):
	if n == 0:
		return 1
	return n * factorial(n - 1)
n = int(input())
if n == 2:
	print(1)
else:
	tw = factorial(n)
	print(tw * 2 // (n * n))


mod = 10 ** 9 + 7

def solve():
	n = int(input())
	ans = 1
	ans2 = 1
	for i in range(n // 2 + 1, n):
		ans *= i
	for i in range(1, n // 2):
		ans2 *= i
	ans *= ans2
	print(ans)
t = 1
while t > 0:
	solve()
	t -= 1


for _ in range(1):
	n = int(input())
	fact = [1] * (n + 1)
	for i in range(1, n + 1):
		fact[i] = fact[i - 1] * i
	ans = fact[n] // (fact[n // 2] * fact[n // 2])
	ans = ans * (fact[n // 2 - 1] * fact[n // 2 - 1])
	print(ans // 2)


from math import factorial

def C(a, b):
	return factorial(a) // (factorial(b) * factorial(a - b))
n = int(input())
x = n // 2
ans = factorial(x - 1) * factorial(x - 1) * C(n, x)
print(ans // 2)


def f(n):
	r = 1
	for i in range(1, n + 1):
		r *= i
	return r
n = int(input())
x = f(n) // (f(n // 2) * f(n // 2))
print(f(n // 2 - 1) ** 2 * x // 2)


def fac(n):
	val = 1
	while n >= 1:
		val *= n
		n -= 1
	return val

def nCr(n, r):
	val = fac(n) // (fac(r) * fac(n - r))
	return val
n = int(input())
ways = nCr(n, n // 2) * fac(n // 2 - 1) ** 2 // 2
print(ways)


t = int(input())
l = [1]
for i in range(1, t + 1):
	temp = l[-1] * i
	l += [temp]
a = l[t]
b = l[int(t / 2)]
ans = a / b
ans /= b
ans /= 2
ans *= l[t // 2 - 1]
ans *= l[t // 2 - 1]
print(int(ans))


import math
people = int(input())
combinations = math.factorial(people) * 2 / people ** 2
print(int(combinations))


def fact(n):
	ans = 1
	for i in range(1, n + 1):
		ans *= i
	return ans

def helper(n, m):
	if n < 0 or m < 0:
		return 0
	if n == 0 and m == 0:
		return 1
	return helper(n - 1, m) + helper(m - 1, n)
n = int(input())
print(helper(n // 2, n // 2) // 2 * fact(n // 2 - 1) ** 2)


import math

def comb(n: int, k: int) -> int:
	return math.factorial(n) // math.factorial(k) // math.factorial(n - k)
n = int(input())
print(comb(n, n // 2) * math.factorial(n // 2 - 1) // 2 * math.factorial(n // 2 - 1))


n = int(input())
f = 1
for i in range(1, n):
	f = f * i
ans = f // (n // 2)
print(ans)


def binomialCoef(n, k):
	C = [[0 for x in range(k + 1)] for x in range(n + 1)]
	for i in range(n + 1):
		for j in range(min(i, k) + 1):
			if j == 0 or j == i:
				C[i][j] = 1
			else:
				C[i][j] = C[i - 1][j - 1] + C[i - 1][j]
	return C[n][k]

def factorial(n):
	return 1 if n == 1 or n == 0 else n * factorial(n - 1)
t = int(input())
c = binomialCoef(t, t // 2)
s = factorial(t // 2 - 1) * factorial(t // 2 - 1)
ans = c * s // 2
print(ans)


from math import factorial as f

def ncr(n, r):
	return f(n) // (f(r) * f(n - r))
n = int(input())
a = ncr(n, n // 2) // 2
b = f(n // 2 - 1)
print(a * b * b)


from math import factorial
n = int(input())
ans = int(2 * factorial(n) / (n * n))
print(ans)


from math import factorial

def a(n, k):
	return factorial(n) // factorial(n - k)
n = int(input())
print(a(n, n // 2) // (n // 2) * factorial(n // 2) // (n // 2) // 2)


n = int(input())
res1 = 1
res2 = 1
for i in range(1, n + 1):
	res1 *= i
for i in range(1, n // 2 + 1):
	res2 = res2 * i
ans = res1 // res2
ans = ans // res2
ans = ans // 2
ans = ans * (res2 // (n // 2)) * (res2 // (n // 2))
print(ans)


fact = []
i = 1
for j in range(1, 21):
	i = i * j
	fact.append(i)
n = int(input())
print(int(fact[n - 1] / (n / 2 * n / 2) / 2))


n = int(input())
fact = 1
for x in range(1, n + 1):
	fact *= x
print(int(fact / (n * (n / 2))))


t = int(input())
f = [0] * 21
f[0] = 1
for i in range(1, 21):
	f[i] = f[i - 1] * i
ans = f[t] // f[t // 2] // f[t // 2]
ans = ans * f[t // 2 - 1]
ans = ans * f[t // 2 - 1]
ans //= 2
print(ans)


import math

def permutations_count(n, r):
	return math.factorial(n) // math.factorial(n - r)

def combinations_count(n, r):
	return math.factorial(n) // (math.factorial(n - r) * math.factorial(r))
n = int(input())
pair = combinations_count(n, n // 2) // 2
print(pair * permutations_count(n // 2 - 1, n // 2 - 1) ** 2)


n = int(input())
fact = [1 for _ in range(n + 1)]
for i in range(2, n + 1):
	fact[i] *= i * fact[i - 1]

def nCk(n, k):
	return fact[n] // (fact[k] * fact[n - k])
print(fact[n] // (2 * (n // 2) ** 2))


n = int(input())

def qpow(b, e):
	result = 1
	while e:
		if e & 1:
			result = result * b
		e = e >> 1
		b = b * b
	return result
from math import factorial as f

def c(n, k):
	return f(n) // (f(k) * f(n - k))
a = c(n, n // 2) // 2
b = f(n // 2 - 1)
if n == 2:
	print(1)
else:
	print(a * b * b)


f = [1]
I = lambda a: pow(a, m - 2, m)
for i in range(1, 20):
	f += [f[-1] * i]
C = lambda a, b: f[a] * I(f[b]) * I(f[a - b])
a = int(input())
print(f[a - 1] // (a // 2))


import math
n = int(input())
k = n // 2
ans = math.factorial(n) // (2 * k ** 2)
print(int(ans))


def nCr(n, r):
	x = factorial(n)
	y = factorial(r) * factorial(n - r)
	z = x // y
	return z

def factorial(n):
	x = 1
	for i in range(1, n + 1):
		x = x * i
	return x
n = int(input())
k = n // 2
n = nCr(n, k)
n = n * factorial(k - 1) * factorial(k - 1)
n = n // 2
print(n)


import math
n = int(input())
fatorialn = math.factorial(n)
permutacao = fatorialn / n
denominador = n / 2
print(int(permutacao / denominador))


def fac(x):
	if x == 1:
		return 1
	return x * fac(x - 1)

def C(n, m):
	return fac(n) / (fac(m) * fac(n - m))
n = int(input())
ans = C(n, n / 2) / 2
ans = ans * (fac(n / 2) / (n / 2))
ans = ans * (fac(n / 2) / (n / 2))
print(int(ans))


from sys import stdin, stdout
import math, bisect
from collections import Counter, deque, defaultdict
L = lambda : list(map(int, stdin.readline().strip().split()))
M = lambda : map(int, stdin.readline().strip().split())
I = lambda : int(stdin.readline().strip())
S = lambda : stdin.readline().strip()
C = lambda : stdin.readline().strip().split()

def pr(a):
	return ''.join(list(map(str, a)))

def solve():
	a = [1, 3, 40, 1260, 72576, 6652800, 889574400, 163459296000, 39520825344000, 12164510040883200]
	print(a[I() // 2 - 1])
for _ in range(1):
	solve()


def fact(n):
	a = 1
	for i in range(1, n + 1):
		a *= i
	return a

def solve():
	n = int(input())
	k = fact(n)
	x = fact(n // 2)
	print(int(k / (n * n / 2)))
solve()


import sys
try:
	(sys.stdin, sys.stdout) = (open('in.txt', 'r'), open('out.txt', 'w'))
except:
	pass
ii1 = lambda : int(sys.stdin.readline().strip())
is1 = lambda : sys.stdin.readline().strip()
iia = lambda : list(map(int, sys.stdin.readline().strip().split()))
isa = lambda : sys.stdin.readline().strip().split()
mod = int(1000000000.0 + 7)
from collections import *
from math import *
n = ii1()
newn = n // 2
prod = 1
for i in range(n - 1, n // 2, -1):
	prod *= i
prod *= factorial(newn - 1)
print(prod)


import sys
from functools import lru_cache, cmp_to_key
from heapq import merge, heapify, heappop, heappush, nsmallest
from math import ceil, floor, gcd, fabs, factorial, fmod, sqrt, inf
from collections import defaultdict as dd, deque, Counter as C
from itertools import combinations as comb, permutations as perm
from bisect import bisect_left as bl, bisect_right as br, bisect
from time import perf_counter
from fractions import Fraction
from decimal import Decimal
mod = pow(10, 9) + 7
mod2 = 998244353

def data():
	return sys.stdin.readline().strip()

def out(var, end='\n'):
	sys.stdout.write(str(var) + '\n')

def outa(*var, end='\n'):
	sys.stdout.write(' '.join(map(str, var)) + end)

def l():
	return list(sp())

def sp():
	return map(int, data().split())

def ssp():
	return map(str, data().split())

def l1d(n, val=0):
	return [val for i in range(n)]

def l2d(n, m, val=0):
	return [l1d(n, val) for j in range(m)]
n = int(input())
print(factorial(n - 1) // (n // 2))


def main():
	n = int(input())
	fact = 1
	for i in range(n):
		fact = fact * (i + 1)
	print(fact * 2 // (n * n))
main()


import math
x = int(input())
print(math.factorial(x - 1) // (x // 2))


import math
import random
import heapq, bisect
import sys
from collections import deque, defaultdict
from fractions import Fraction
import sys
from collections import defaultdict
mod = 10 ** 9 + 7
mod1 = 998244353
import os
import sys
from io import BytesIO, IOBase
BUFSIZE = 8192

class FastIO(IOBase):
	newlines = 0

	def __init__(self, file):
		self._fd = file.fileno()
		self.buffer = BytesIO()
		self.writable = 'x' in file.mode or 'r' not in file.mode
		self.write = self.buffer.write if self.writable else None

	def read(self):
		while True:
			b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
			if not b:
				break
			ptr = self.buffer.tell()
			(self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
		self.newlines = 0
		return self.buffer.read()

	def readline(self):
		while self.newlines == 0:
			b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
			self.newlines = b.count(b'\n') + (not b)
			ptr = self.buffer.tell()
			(self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
		self.newlines -= 1
		return self.buffer.readline()

	def flush(self):
		if self.writable:
			os.write(self._fd, self.buffer.getvalue())
			(self.buffer.truncate(0), self.buffer.seek(0))

class IOWrapper(IOBase):

	def __init__(self, file):
		self.buffer = FastIO(file)
		self.flush = self.buffer.flush
		self.writable = self.buffer.writable
		self.write = lambda s: self.buffer.write(s.encode('ascii'))
		self.read = lambda : self.buffer.read().decode('ascii')
		self.readline = lambda : self.buffer.readline().decode('ascii')
(sys.stdin, sys.stdout) = (IOWrapper(sys.stdin), IOWrapper(sys.stdout))
input = lambda : sys.stdin.readline().rstrip('\r\n')

class TreeNode:

	def __init__(self, k, v):
		self.key = k
		self.value = v
		self.left = None
		self.right = None
		self.parent = None
		self.height = 1
		self.num_left = 1
		self.num_total = 1

class AvlTree:

	def __init__(self):
		self._tree = None

	def add(self, k, v):
		if not self._tree:
			self._tree = TreeNode(k, v)
			return
		node = self._add(k, v)
		if node:
			self._rebalance(node)

	def _add(self, k, v):
		node = self._tree
		while node:
			if k < node.key:
				if node.left:
					node = node.left
				else:
					node.left = TreeNode(k, v)
					node.left.parent = node
					return node.left
			elif node.key < k:
				if node.right:
					node = node.right
				else:
					node.right = TreeNode(k, v)
					node.right.parent = node
					return node.right
			else:
				node.value = v
				return

	@staticmethod
	def get_height(x):
		return x.height if x else 0

	@staticmethod
	def get_num_total(x):
		return x.num_total if x else 0

	def _rebalance(self, node):
		n = node
		while n:
			lh = self.get_height(n.left)
			rh = self.get_height(n.right)
			n.height = max(lh, rh) + 1
			balance_factor = lh - rh
			n.num_total = 1 + self.get_num_total(n.left) + self.get_num_total(n.right)
			n.num_left = 1 + self.get_num_total(n.left)
			if balance_factor > 1:
				if self.get_height(n.left.left) < self.get_height(n.left.right):
					self._rotate_left(n.left)
				self._rotate_right(n)
			elif balance_factor < -1:
				if self.get_height(n.right.right) < self.get_height(n.right.left):
					self._rotate_right(n.right)
				self._rotate_left(n)
			else:
				n = n.parent

	def _remove_one(self, node):
		replacement = node.left or node.right
		if node.parent:
			if AvlTree._is_left(node):
				node.parent.left = replacement
			else:
				node.parent.right = replacement
			replacement.parent = node.parent
			node.parent = None
		else:
			self._tree = replacement
			replacement.parent = None
		node.left = None
		node.right = None
		node.parent = None
		self._rebalance(replacement)

	def _remove_leaf(self, node):
		if node.parent:
			if AvlTree._is_left(node):
				node.parent.left = None
			else:
				node.parent.right = None
			self._rebalance(node.parent)
		else:
			self._tree = None
		node.parent = None
		node.left = None
		node.right = None

	def remove(self, k):
		node = self._get_node(k)
		if not node:
			return
		if AvlTree._is_leaf(node):
			self._remove_leaf(node)
			return
		if node.left and node.right:
			nxt = AvlTree._get_next(node)
			node.key = nxt.key
			node.value = nxt.value
			if self._is_leaf(nxt):
				self._remove_leaf(nxt)
			else:
				self._remove_one(nxt)
			self._rebalance(node)
		else:
			self._remove_one(node)

	def get(self, k):
		node = self._get_node(k)
		return node.value if node else -1

	def _get_node(self, k):
		if not self._tree:
			return None
		node = self._tree
		while node:
			if k < node.key:
				node = node.left
			elif node.key < k:
				node = node.right
			else:
				return node
		return None

	def get_at(self, pos):
		x = pos + 1
		node = self._tree
		while node:
			if x < node.num_left:
				node = node.left
			elif node.num_left < x:
				x -= node.num_left
				node = node.right
			else:
				return (node.key, node.value)
		raise IndexError('Out of ranges')

	@staticmethod
	def _is_left(node):
		return node.parent.left and node.parent.left == node

	@staticmethod
	def _is_leaf(node):
		return node.left is None and node.right is None

	def _rotate_right(self, node):
		if not node.parent:
			self._tree = node.left
			node.left.parent = None
		elif AvlTree._is_left(node):
			node.parent.left = node.left
			node.left.parent = node.parent
		else:
			node.parent.right = node.left
			node.left.parent = node.parent
		bk = node.left.right
		node.left.right = node
		node.parent = node.left
		node.left = bk
		if bk:
			bk.parent = node
		node.height = max(self.get_height(node.left), self.get_height(node.right)) + 1
		node.num_total = 1 + self.get_num_total(node.left) + self.get_num_total(node.right)
		node.num_left = 1 + self.get_num_total(node.left)

	def _rotate_left(self, node):
		if not node.parent:
			self._tree = node.right
			node.right.parent = None
		elif AvlTree._is_left(node):
			node.parent.left = node.right
			node.right.parent = node.parent
		else:
			node.parent.right = node.right
			node.right.parent = node.parent
		bk = node.right.left
		node.right.left = node
		node.parent = node.right
		node.right = bk
		if bk:
			bk.parent = node
		node.height = max(self.get_height(node.left), self.get_height(node.right)) + 1
		node.num_total = 1 + self.get_num_total(node.left) + self.get_num_total(node.right)
		node.num_left = 1 + self.get_num_total(node.left)

	@staticmethod
	def _get_next(node):
		if not node.right:
			return node.parent
		n = node.right
		while n.left:
			n = n.left
		return n

class SegmentTree1:

	def __init__(self, data, default=300006, func=lambda a, b: min(a, b)):
		self._default = default
		self._func = func
		self._len = len(data)
		self._size = _size = 1 << (self._len - 1).bit_length()
		self.data = [default] * (2 * _size)
		self.data[_size:_size + self._len] = data
		for i in reversed(range(_size)):
			self.data[i] = func(self.data[i + i], self.data[i + i + 1])

	def __delitem__(self, idx):
		self[idx] = self._default

	def __getitem__(self, idx):
		return self.data[idx + self._size]

	def __setitem__(self, idx, value):
		idx += self._size
		self.data[idx] = value
		idx >>= 1
		while idx:
			self.data[idx] = self._func(self.data[2 * idx], self.data[2 * idx + 1])
			idx >>= 1

	def __len__(self):
		return self._len

	def query(self, start, stop):
		if start == stop:
			return self.__getitem__(start)
		stop += 1
		start += self._size
		stop += self._size
		res = self._default
		while start < stop:
			if start & 1:
				res = self._func(res, self.data[start])
				start += 1
			if stop & 1:
				stop -= 1
				res = self._func(res, self.data[stop])
			start >>= 1
			stop >>= 1
		return res

	def __repr__(self):
		return 'SegmentTree({0})'.format(self.data)

class SegmentTree:

	def __init__(self, data, default=0, func=lambda a, b: a + b):
		self._default = default
		self._func = func
		self._len = len(data)
		self._size = _size = 1 << (self._len - 1).bit_length()
		self.data = [default] * (2 * _size)
		self.data[_size:_size + self._len] = data
		for i in reversed(range(_size)):
			self.data[i] = func(self.data[i + i], self.data[i + i + 1])

	def __delitem__(self, idx):
		self[idx] = self._default

	def __getitem__(self, idx):
		return self.data[idx + self._size]

	def __setitem__(self, idx, value):
		idx += self._size
		self.data[idx] = value
		idx >>= 1
		while idx:
			self.data[idx] = self._func(self.data[2 * idx], self.data[2 * idx + 1])
			idx >>= 1

	def __len__(self):
		return self._len

	def query(self, start, stop):
		if start == stop:
			return self.__getitem__(start)
		stop += 1
		start += self._size
		stop += self._size
		res = self._default
		while start < stop:
			if start & 1:
				res = self._func(res, self.data[start])
				start += 1
			if stop & 1:
				stop -= 1
				res = self._func(res, self.data[stop])
			start >>= 1
			stop >>= 1
		return res

	def __repr__(self):
		return 'SegmentTree({0})'.format(self.data)

class Factorial:

	def __init__(self, MOD):
		self.MOD = MOD
		self.factorials = [1, 1]
		self.invModulos = [0, 1]
		self.invFactorial_ = [1, 1]

	def calc(self, n):
		if n <= -1:
			print('Invalid argument to calculate n!')
			print('n must be non-negative value. But the argument was ' + str(n))
			exit()
		if n < len(self.factorials):
			return self.factorials[n]
		nextArr = [0] * (n + 1 - len(self.factorials))
		initialI = len(self.factorials)
		prev = self.factorials[-1]
		m = self.MOD
		for i in range(initialI, n + 1):
			prev = nextArr[i - initialI] = prev * i % m
		self.factorials += nextArr
		return self.factorials[n]

	def inv(self, n):
		if n <= -1:
			print('Invalid argument to calculate n^(-1)')
			print('n must be non-negative value. But the argument was ' + str(n))
			exit()
		p = self.MOD
		pi = n % p
		if pi < len(self.invModulos):
			return self.invModulos[pi]
		nextArr = [0] * (n + 1 - len(self.invModulos))
		initialI = len(self.invModulos)
		for i in range(initialI, min(p, n + 1)):
			next = -self.invModulos[p % i] * (p // i) % p
			self.invModulos.append(next)
		return self.invModulos[pi]

	def invFactorial(self, n):
		if n <= -1:
			print('Invalid argument to calculate (n^(-1))!')
			print('n must be non-negative value. But the argument was ' + str(n))
			exit()
		if n < len(self.invFactorial_):
			return self.invFactorial_[n]
		self.inv(n)
		nextArr = [0] * (n + 1 - len(self.invFactorial_))
		initialI = len(self.invFactorial_)
		prev = self.invFactorial_[-1]
		p = self.MOD
		for i in range(initialI, n + 1):
			prev = nextArr[i - initialI] = prev * self.invModulos[i % p] % p
		self.invFactorial_ += nextArr
		return self.invFactorial_[n]

class Combination:

	def __init__(self, MOD):
		self.MOD = MOD
		self.factorial = Factorial(MOD)

	def ncr(self, n, k):
		if k < 0 or n < k:
			return 0
		k = min(k, n - k)
		f = self.factorial
		return f.calc(n) * f.invFactorial(max(n - k, k)) * f.invFactorial(min(k, n - k)) % self.MOD

def powm(a, n, m):
	if a == 1 or n == 0:
		return 1
	if n % 2 == 0:
		s = powm(a, n // 2, m)
		return s * s % m
	else:
		return a * powm(a, n - 1, m) % m

def sort_list(list1, list2):
	zipped_pairs = zip(list2, list1)
	z = [x for (_, x) in sorted(zipped_pairs)]
	return z

def product(l):
	por = 1
	for i in range(len(l)):
		por *= l[i]
	return por

def binarySearchCount(arr, n, key):
	left = 0
	right = n - 1
	count = 0
	while left <= right:
		mid = int((right + left) / 2)
		if arr[mid] < key:
			count = mid + 1
			left = mid + 1
		else:
			right = mid - 1
	return count

def countdig(n):
	c = 0
	while n > 0:
		n //= 10
		c += 1
	return c

def binary(x, length):
	y = bin(x)[2:]
	return y if len(y) >= length else '0' * (length - len(y)) + y

def countGreater(arr, n, k):
	l = 0
	r = n - 1
	leftGreater = n
	while l <= r:
		m = int(l + (r - l) / 2)
		if arr[m] > k:
			leftGreater = m
			r = m - 1
		else:
			l = m + 1
	return n - leftGreater

class TrieNode:

	def __init__(self):
		self.children = [None] * 26
		self.isEndOfWord = False

class Trie:

	def __init__(self):
		self.root = self.getNode()

	def getNode(self):
		return TrieNode()

	def _charToIndex(self, ch):
		return ord(ch) - ord('a')

	def insert(self, key):
		pCrawl = self.root
		length = len(key)
		for level in range(length):
			index = self._charToIndex(key[level])
			if not pCrawl.children[index]:
				pCrawl.children[index] = self.getNode()
			pCrawl = pCrawl.children[index]
		pCrawl.isEndOfWord = True

	def search(self, key):
		pCrawl = self.root
		length = len(key)
		for level in range(length):
			index = self._charToIndex(key[level])
			if not pCrawl.children[index]:
				return False
			pCrawl = pCrawl.children[index]
		return pCrawl != None and pCrawl.isEndOfWord

class Node:

	def __init__(self, data):
		self.data = data
		self.count = 0
		self.left = None
		self.right = None

class BinaryTrie:

	def __init__(self):
		self.root = Node(0)

	def insert(self, pre_xor):
		self.temp = self.root
		for i in range(31, -1, -1):
			val = pre_xor & 1 << i
			if val:
				if not self.temp.right:
					self.temp.right = Node(0)
				self.temp = self.temp.right
				self.temp.count += 1
			if not val:
				if not self.temp.left:
					self.temp.left = Node(0)
				self.temp = self.temp.left
				self.temp.count += 1
		self.temp.data = pre_xor

	def query(self, xor):
		self.temp = self.root
		for i in range(31, -1, -1):
			val = xor & 1 << i
			if not val:
				if self.temp.left and self.temp.left.count > 0:
					self.temp = self.temp.left
				elif self.temp.right:
					self.temp = self.temp.right
			elif self.temp.right and self.temp.right.count > 0:
				self.temp = self.temp.right
			elif self.temp.left:
				self.temp = self.temp.left
			self.temp.count -= 1
		return xor ^ self.temp.data
n = int(input())
t = n
num = 1
t1 = 1
fact = 1
for i in range(n // 2):
	num *= t
	t -= 1
	fact *= i + 1
r = n // 2
tot = fact // r * (num // r)
print(tot // 2)


n = int(input())
ans = 1
for i in range(2, n):
	if i != n // 2:
		ans = ans * i
print(ans)


import typing
import math

def rl(*args) -> typing.Iterable:
	(func, funcs) = (int, (int, float, str))
	(itr, itrs) = (iter, (iter, list, tuple, set))
	sep = ' '
	for a in args:
		if a in funcs:
			func = a
		elif a in itrs:
			itr = a
		elif isinstance(a, str):
			sep = a
	return itr(map(func, input().strip().split(sep)))
n = int(input())
n_half = math.factorial(n) // math.factorial(n // 2) ** 2
n_rounds = math.factorial(n // 2) // (n // 2)
print(n_half // 2 * n_rounds * n_rounds)


def factorial(x):
	if x == 0:
		return 1
	return x * factorial(x - 1)
n = int(input())
print(factorial(n) // (2 * factorial(n // 2) ** 2) * factorial(n // 2 - 1) ** 2)


import math
n = int(input())
ways = math.factorial(n) / (math.factorial(int(n / 2)) * math.factorial(int(n / 2))) * math.factorial(int(n / 2 - 1)) * math.factorial(int(n / 2 - 1)) / 2
print(int(ways))


from math import factorial as fac
x = int(input())
print(fac(x) // x // (x // 2))


def fact(q):
	pro = 1
	for i in range(2, q + 1):
		pro *= i
	return pro

def comb(p, q):
	return fact(p) // pow(fact(q), 2)
n = int(input())
val = comb(n, n // 2) * fact(n // 2 - 1) ** 2 // 2
print(val)


num = int(input())
factorial = 1
for i in range(1, num):
	factorial = factorial * i
ans = factorial / (num / 2)
print(int(ans))


import sys
reader = (s.rstrip() for s in sys.stdin)
input = reader.__next__
import math
n = int(input())
print(math.factorial(n) // math.factorial(n // 2) // n * math.factorial(n // 2 - 1))


import math

def main():
	n = int(input())
	k = n // 2
	ans = math.factorial(n) // math.factorial(k) // math.factorial(k)
	ans //= 2
	ans *= math.factorial(k - 1) * math.factorial(k - 1)
	print(ans)
py2 = round(0.5)
if py2:
	from future_builtins import ascii, filter, hex, map, oct, zip
	range = xrange
import os, sys
from io import IOBase, BytesIO
BUFSIZE = 8192

class FastIO(BytesIO):
	newlines = 0

	def __init__(self, file):
		self._file = file
		self._fd = file.fileno()
		self.writable = 'x' in file.mode or 'w' in file.mode
		self.write = super(FastIO, self).write if self.writable else None

	def _fill(self):
		s = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
		self.seek((self.tell(), self.seek(0, 2), super(FastIO, self).write(s))[0])
		return s

	def read(self):
		while self._fill():
			pass
		return super(FastIO, self).read()

	def readline(self):
		while self.newlines == 0:
			s = self._fill()
			self.newlines = s.count(b'\n') + (not s)
		self.newlines -= 1
		return super(FastIO, self).readline()

	def flush(self):
		if self.writable:
			os.write(self._fd, self.getvalue())
			(self.truncate(0), self.seek(0))

class IOWrapper(IOBase):

	def __init__(self, file):
		self.buffer = FastIO(file)
		self.flush = self.buffer.flush
		self.writable = self.buffer.writable
		if py2:
			self.write = self.buffer.write
			self.read = self.buffer.read
			self.readline = self.buffer.readline
		else:
			self.write = lambda s: self.buffer.write(s.encode('ascii'))
			self.read = lambda : self.buffer.read().decode('ascii')
			self.readline = lambda : self.buffer.readline().decode('ascii')
(sys.stdin, sys.stdout) = (IOWrapper(sys.stdin), IOWrapper(sys.stdout))
input = lambda : sys.stdin.readline().rstrip('\r\n')
main()


import sys
input = sys.stdin.readline
from collections import defaultdict as dc
from collections import Counter
from bisect import bisect_right
import math
n = int(input())
l = [1, 4, 3, 48, 40, 1440, 1260, 8960, 72576, 7257600, 6652800, 958003200, 889574400, 11623772160, 163459296000, 41845579776000, 39520825344000, 12804747411456000, 12164510040883200]
print(l[n - 2])


import math
n = int(input())

def nCr(n, r):
	f = math.factorial
	return f(n) // f(r) // f(n - r)
print(int(math.factorial(n // 2 - 1) ** 2 * nCr(n, n // 2) / 2))


from math import *
t = int(input())
if t == 2:
	print(1)
elif t == 4:
	print(3)
elif t == 6:
	print(40)
elif t == 8:
	print(1260)
elif t == 10:
	print(72576)
elif t == 12:
	print(6652800)
elif t == 14:
	print(889574400)
elif t == 16:
	print(163459296000)
elif t == 18:
	print(39520825344000)
elif t == 20:
	print(12164510040883200)


from itertools import permutations
from math import factorial
for _ in range(1):
	n = int(input())
	a = factorial(n)
	print(factorial(n - 1) // (n // 2))


import sys
import math
n = int(sys.stdin.readline())
v = math.factorial(n // 2 - 1)
x = math.factorial(n) // pow(math.factorial(n // 2), 2)
print(v * v * x // 2)


n = int(input())
ans = 1
for i in range(1, n // 2):
	ans *= i
ans = ans * ans // 2
if ans == 0:
	ans = 1
fenzi = 1
fenmu = 1
for i in range(n // 2 + 1, n + 1):
	fenzi *= i
for i in range(1, n // 2 + 1):
	fenmu *= i
if n == 2 or n == 4:
	print(ans * (fenzi // fenmu) // 2)
else:
	print(ans * (fenzi // fenmu))


n = int(input())
(den, num) = (1, 1)
for i in range(1, n // 2 + 1):
	den *= i
for i in range(n - n // 2 + 1, n + 1):
	num *= i
com = num // den
fac = 1
for i in range(1, n // 2):
	fac *= i
print(com // 2 * (fac * fac))


n = [int(x) for x in input().split()]
n = n[0]
res = 0
proiz = 1
for i in range(2, n + 1):
	proiz *= i
res = proiz
res = res // (n // 2)
res = res // (n // 2)
res = res // 2
print()
print(res)
print()


from collections import Counter, defaultdict
I = lambda : int(input())
M = lambda : map(int, input().split())
LI = lambda : list(map(int, input().split()))
for _ in range(1):
	n = I()
	nf = 1
	for i in range(1, n):
		nf *= i
	print(nf // (n // 2))


rr = lambda : input().strip()
rri = lambda : int(rr())
rrm = lambda : [int(x) for x in rr().split()]
from sys import stdin, stdout, setrecursionlimit
from math import ceil, factorial as fact
from heapq import *

def sol():
	n = rri()
	dp = [1 for i in range(15)]
	for i in range(3, 15):
		dp[i] = dp[i - 1] * (i - 1)
	res = fact(n) // (fact(n // 2) * fact(n // 2) * 2) * dp[n // 2] * dp[n // 2]
	print(res)
	return

def main():
	ans = sol()
main()


t = int(input())
pr1 = 1
for i in range(int(t / 2) + 1, t + 1):
	pr1 = pr1 * i
pr = 1
for i in range(1, int(t / 2) + 1):
	pr = pr * i
k = pr1 // pr
k = k // 2
s = pr // int(t / 2)
print(k * s * s)


from collections import defaultdict

def fact(n):
	c = 1
	for i in range(1, n + 1):
		c *= i
	return c
for z in range(1):
	n = int(input())
	ans = fact(n) // fact(n // 2) ** 2 * fact(n // 2 - 1) ** 2 // 2
	print(ans)


from math import *
n = int(input())
C = factorial(n)
A = C // (n // 2) // (n // 2)
print(int(A // 2))


from functools import reduce
import os
import sys
from collections import *
from math import *
from bisect import *
from heapq import *
from io import BytesIO, IOBase
input = lambda : sys.stdin.readline().rstrip('\r\n')

def value():
	return tuple(map(int, input().split()))

def arr():
	return [int(i) for i in input().split()]

def sarr():
	return [int(i) for i in input()]

def starr():
	return [str(x) for x in input().split()]

def inn():
	return int(input())

def svalue():
	return tuple(map(str, input().split()))

def parr():
	return [value() for i in range(n)]
mo = 1000000007
inf = 1e+18
div = 998244353

def ncr(n, r):
	p = 1
	k = 1
	if n - r < r:
		r = n - r
	if r != 0:
		while r:
			p *= n
			k *= r
			m = gcd(p, k)
			p //= m
			k //= m
			n -= 1
			r -= 1
	else:
		p = 1
	return p
n = inn()
res = n // 2
val = 1
for i in range(1, res):
	val *= i
ans = ncr(n, res)
val = val ** 2
print(ans * val // 2)


import sys
INF = 10 ** 20
MOD = 10 ** 9 + 7
I = lambda : list(map(int, input().split()))
from math import gcd
from math import ceil, log2, factorial
from collections import defaultdict as dd, Counter
from bisect import bisect_left as bl, bisect_right as br
(n,) = I()

def nCk(n, k):
	return factorial(n) // (factorial(k) * factorial(n - k))
print(nCk(n, n // 2) * factorial(n // 2 - 1) ** 2 // 2)


def abc(n):
	c = 1
	for i in range(2, n + 1):
		c = c * i
	return c * 2 // (n * n)
k = 1
while k:
	n = int(input())
	print(abc(n))
	k -= 1


import os
from sys import stdin, stdout

def solve(tc):
	n = int(stdin.readline().strip())
	half = n // 2
	base = 1
	fact = 1
	for i in range(half):
		base *= n - i
		fact *= i + 1
	base //= fact * 2
	base *= fact // half * (fact // half)
	print(base)
tcs = 1
tc = 1
while tc <= tcs:
	solve(tc)
	tc += 1


from math import factorial
n = int(input())
choices = factorial(n) // factorial(n // 2) ** 2 // 2
perms = factorial(n // 2 - 1) ** 2
print(choices * perms)


n = int(input())
w = []
for i in range(1, n + 1):
	if i == 1:
		w.append(i)
	else:
		w.append(w[-1] * i)
print(2 * w[-1] // (n * n))


n = 43
fac = [1]
for i in range(1, n):
	fac.append(i * fac[-1])
n = int(input())
n -= 2
x = int(fac[n + 1] / (n // 2 + 1))
print(x)


from math import factorial as f
n = int(input())
print(f(n) // 2 // (n // 2) // (n // 2))


def solve():

	def C(n, p):
		if n == 0 or n == p:
			return 1
		return C(n, p - 1) + C(n - 1, p - 1)

	def factorial(n):
		result = 1
		for i in range(1, n + 1):
			result *= i
		return result
	n = int(input())
	fact = factorial(n // 2 - 1)
	ans = C(n // 2, n) * fact * fact // 2
	print(ans)
solve()


from sys import stdin
n = int(stdin.readline().strip())
ans = 2
for i in range(1, n + 1):
	ans *= i
print(ans // (n * n))


from math import factorial

def dance(n):
	return int(factorial(n) / (factorial(n // 2) * factorial(n - n // 2)) * factorial(n // 2 - 1) ** 2 // 2)
print(dance(int(input())))


from sys import stdin, stdout
n = int(stdin.readline())
fac = 1
for i in range(2, n + 1):
	fac *= i
div = (n // 2) ** 2 * 2
print(fac // div)


import operator as op
from functools import reduce
import math

def ncr(n, r):
	r = min(r, n - r)
	numer = reduce(op.mul, range(n, n - r, -1), 1)
	denom = reduce(op.mul, range(1, r + 1), 1)
	return numer // denom
n = int(input())
print(ncr(n, n // 2) // 2 * pow(math.factorial(n // 2 - 1), 2))


from math import factorial

def c(n, k):
	return factorial(n) // factorial(k) // factorial(n - k)
n = int(input())
print(c(n, n // 2) * factorial(n // 2 - 1) ** 2 // 2)


import sys

def rl():
	return sys.stdin.readline().strip()

def pr(something):
	sys.stdout.write(str(something) + '\n')

def pra(array):
	sys.stdout.write(' '.join([str(x) for x in array]) + '\n')

def solve(array):
	return array
N = int(rl())
H = N // 2

def fact(n):
	return 1 if n <= 1 else n * fact(n - 1)
num_pairings = fact(N) // (2 * fact(H) ** 2)
if True:
	ncirc = 1 if H <= 2 else fact(H - 1)
	pr(num_pairings * ncirc * ncirc)
else:
	ncirc = [0] * (H + 1)
	if H >= 1:
		ncirc[1] = 1
	if H >= 2:
		ncirc[2] = 1
	if H >= 3:
		ncirc[3] = 1
	for i in range(4, H + 1):
		ncirc[i] = ncirc[i - 1] * (i // 2)
	pr(num_pairings * ncirc[-1] * ncirc[-1])


from math import *
n = int(input())
print('{:.0f}'.format(factorial(n) // n // (n / 2)))


import sys
n = int(sys.stdin.readline())
facto = [1] * n
for i in range(1, n):
	facto[i] = facto[i - 1] * i
print(facto[n - 1] * 2 // n)


n = int(input())
x = 1
for i in range(1, n // 2):
	x = x * i
c = [[1] * 21 for i in range(21)]
for i in range(2, 21):
	for j in range(1, i):
		c[i][j] = c[i - 1][j - 1] + c[i - 1][j]
print(c[n - 1][n // 2] * x * x)


from sys import stdin, stdout
from collections import defaultdict
from math import gcd

def II():
	return int(stdin.readline())

def nCr(n, r):
	p = 1
	k = 1
	if n - r < r:
		r = n - r
	if r != 0:
		while r:
			p *= n
			k *= r
			m = gcd(p, k)
			p //= m
			k //= m
			n -= 1
			r -= 1
	else:
		p = 1
	return p
n = II()
r = n // 2
fact = defaultdict(list)
fact[0] = 1
for i in range(1, 11):
	fact[i] = i * fact[i - 1]
ans = nCr(n, r) * fact[r - 1] * fact[r - 1]
ans = ans // 2
stdout.write(str(ans) + '\n')


n = int(input())
n = n // 2
fac = 1
n -= 1
for i in range(1, 2 * n + 2):
	fac *= i
print(fac // (n + 1))


import sys
input = sys.stdin.readline

def cal(n):
	res = 1
	for i in range(n, n // 2, -1):
		res *= i
	for i in range(1, n // 2 + 1):
		res //= i
	return res
fac = [1, 1]
for i in range(2, 21):
	fac.append(fac[-1] * i)
n = int(input())
print(cal(n) * (fac[n // 2 - 1] * fac[n // 2 - 1]) // 2)


a = [0, 0, 1, 4, 3, 48, 40, 1440, 1260, 8960, 72576, 7257600, 6652800, 958003200, 889574400, 11623772160, 163459296000, 41845579776000, 39520825344000, 12804747411456000, 12164510040883200]
n = int(input())
print(a[n])


import operator as op
from math import factorial
from functools import reduce

def ncr(n, r):
	r = min(r, n - r)
	numer = reduce(op.mul, range(n, n - r, -1), 1)
	denom = reduce(op.mul, range(1, r + 1), 1)
	return numer // denom

def solve():
	n = int(input())
	if n == 2:
		print(1)
		return
	nd2 = n // 2
	nr = ncr(n, nd2)
	print(nr * factorial(nd2 - 1) * factorial(nd2 - 1) // 2)
t = 1
for _ in range(t):
	solve()


def comb(a, b):
	if b > a:
		return 0
	ans = fact(a) // (fact(b) * fact(a - b))
	return ans

def fact(a):
	ans = 1
	for i in range(1, a + 1):
		ans *= i
	return ans
s = input()
n = int(s)
a = comb(n, n // 2) * fact(n // 2 - 1) * fact(n // 2 - 1) // 2
print(a)


def nCr(n, r):
	return fact(n) // (fact(r) * fact(n - r))

def fact(n):
	res = 1
	for i in range(1, n + 1):
		res *= i
	return res
k = int(input())
ans = nCr(k, k // 2) * fact(k // 2 - 1) ** 2 // 2
print(ans)


n = int(input())
factorial = [0] * 20
factorial[0] = 1
factorial[1] = 2
factorial[2] = 6
for j in range(3, 20):
	factorial[j] = factorial[j - 1] * (j + 1)
print(factorial[n - 1] // ((n // 2) ** 2 * 2))


from math import factorial
n = int(input())
x = factorial(n) / (factorial(n // 2) ** 2 * 2)
y = (factorial(n // 2 - 1) / 2) ** 2
print(int(x * y * 4))


n = int(input())
ji = 1
for i in range(1, n + 1):
	ji = ji * i
print(int(ji / n / n * 2))


def fact(n):
	count = 1
	for i in range(1, n + 1):
		count *= i
	return count

def choose(a, b):
	count = 1
	h = fact(a)
	i = fact(a - b)
	j = fact(b)
	return h // (i * j)
a = int(input())
x = choose(a, a // 2)
y = fact(a // 2 - 1)
print(x * y * y // 2)


import math
Num = int(input())
X = Num // 2
m = math.factorial(Num) // (math.factorial(X) * math.factorial(X))
s = m * math.factorial(X - 1)
s = s * math.factorial(X - 1)
print(s // 2)


def get_ints():
	return [int(x) for x in input().split()]
n = int(input())
from math import prod

def C(n, k):
	res = 1
	for i in range(k + 1, n + 1):
		res *= i
	for i in range(1, n - k + 1):
		res //= i
	return res
print(C(n, n // 2) // 2 * prod([i for i in range(1, n // 2)]) ** 2)


from functools import reduce

def fact(n):
	if n == 0:
		return 1
	return reduce(lambda x, y: x * y, [i for i in range(1, n + 1)])
n = int(input())
binom = fact(n) // (2 * (fact(n // 2) * fact(n // 2)))
print(fact(n // 2 - 1) ** 2 * binom)


print([1, 3, 40, 1260, 72576, 6652800, 889574400, 163459296000, 39520825344000, 12164510040883200][int(input()) // 2 - 1])


def f(n):
	res = 1
	for i in range(2, n + 1):
		res = res * i
	return res
n = int(input())
if n == 2:
	print(1)
elif n == 4:
	print(3)
else:
	ans = f(n) // (2 * n * n)
	print(ans * 4)


import sys
import math as m
input = sys.stdin.readline
n = int(input())
k = n
a = n
print(m.factorial(a // 2 - 1) * m.factorial(k // 2 - 1) * m.comb(n, n // 2) // 2)


import os
import sys
from io import BytesIO, IOBase

def main():
	n = int(input())
	ans = 1
	for i in range(2, n):
		ans *= i
	print(2 * ans // n)
BUFSIZE = 8192

class FastIO(IOBase):
	newlines = 0

	def __init__(self, file):
		self._fd = file.fileno()
		self.buffer = BytesIO()
		self.writable = 'x' in file.mode or 'r' not in file.mode
		self.write = self.buffer.write if self.writable else None

	def read(self):
		while True:
			b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
			if not b:
				break
			ptr = self.buffer.tell()
			(self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
		self.newlines = 0
		return self.buffer.read()

	def readline(self):
		while self.newlines == 0:
			b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
			self.newlines = b.count(b'\n') + (not b)
			ptr = self.buffer.tell()
			(self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
		self.newlines -= 1
		return self.buffer.readline()

	def flush(self):
		if self.writable:
			os.write(self._fd, self.buffer.getvalue())
			(self.buffer.truncate(0), self.buffer.seek(0))

class IOWrapper(IOBase):

	def __init__(self, file):
		self.buffer = FastIO(file)
		self.flush = self.buffer.flush
		self.writable = self.buffer.writable
		self.write = lambda s: self.buffer.write(s.encode('ascii'))
		self.read = lambda : self.buffer.read().decode('ascii')
		self.readline = lambda : self.buffer.readline().decode('ascii')
(sys.stdin, sys.stdout) = (IOWrapper(sys.stdin), IOWrapper(sys.stdout))
input = lambda : sys.stdin.readline().rstrip('\r\n')
main()


import math
n = int(input())
m = int(n / 2)
a = math.factorial(n)
b = math.factorial(m)
c = math.factorial(m)
f = math.factorial(m - 1)
d = int(a / (b * c))
e = int(d / 2) * f * f
print(e)


def f(a, b):
	t = 1
	for i in range(a, b + 1):
		t *= i
	return t
t = [2, 8, 18, 32, 50, 72, 98, 128, 162, 200]
n = int(input())
print(int(f(1, n) / t[int(n / 2 - 1)]))


def jc(n):
	a = 1
	for i in range(n, 1, -1):
		a *= i
	return a
n = int(input())
m = jc(n) * 2
m = m / (n * n)
print(int(m))


import math
n = int(input())
fac1 = math.factorial(n)
fac2 = math.factorial(n // 2)
print(2 * fac1 // (n * n))


def fact(n):
	i = 2
	fact = 1
	while i <= n:
		fact = fact * i
		i += 1
	return fact

def nCr(n, r):
	return fact(n) / (fact(r) * fact(n - r))
n = int(input())
res = nCr(n, n / 2)
prod = fact(n / 2 - 1)
res /= 2
res *= prod ** 2
print(int(res))


def C(n, r, mod=10 ** 23):
	if n - r < r:
		r = n - r
	if r == 0:
		return 1
	if r == 1:
		return n
	numerator = [n - r + k + 1 for k in range(r)]
	denominator = [k + 1 for k in range(r)]
	for p in range(2, r + 1):
		pivot = denominator[p - 1]
		if pivot > 1:
			offset = (n - r) % p
			for k in range(p - 1, r, p):
				numerator[k - offset] /= pivot
				denominator[k] /= pivot
	result = 1
	for k in range(r):
		if numerator[k] > 1:
			result *= int(numerator[k]) % mod
	return result % mod

def kai(n):
	if n == 0:
		return 1
	if n == 1:
		return 1
	return n * kai(n - 1)
import sys
try:
	import os
	f = open('input.txt', 'r')
	sys.stdin = f
except FileNotFoundError:
	None
from math import sqrt, ceil
input = lambda : sys.stdin.readline().strip()
n = int(input())
print(C(n, n // 2) // 2 * kai(n // 2 - 1) ** 2)


import math
import sys
import collections
import bisect
input = sys.stdin.readline
flush = sys.stdout.flush
readint = lambda : int(input())
readintm = lambda : map(int, input().strip().split())
readintl = lambda : list(map(int, input().strip().split()))
readfloatm = lambda : map(float, input().strip().split())
readfloatl = lambda : list(map(float, input().strip().split()))
readstr = lambda : input().strip()
readstrl = lambda : list(input().strip())
join = lambda x, l: x.join(map(str, l))
print = lambda *x: sys.stdout.write(' '.join(map(str, x)) + '\n')
printl = lambda l: sys.stdout.write(' '.join(map(str, l)) + '\n')
ceil = lambda x, y: (x + y - 1) // y
mod = 1000000007

def comb(n, k):
	f = math.factorial
	return f(n) / (f(k) * f(n - k))
n = readint()
print(int(comb(n, n // 2) // 2 * pow(math.factorial(n // 2 - 1), 2)))


import sys
import math as m

def fi():
	return sys.stdin.readline()
n = int(fi())
print(int(m.factorial(n) // ((n / 2) ** 2 * 2)))


import sys
import math
from collections import defaultdict, Counter

def find(n):
	p = math.factorial(n)
	q = math.factorial(n // 2)
	return (p // (q * q), q)
n = int(input())
(ma, mi) = find(n)
d = mi // (n // 2)
print(ma * d * d // 2)


n = int(input())
k = n // 2
num = 1
for i in range(n, k, -1):
	num = num * i
den = 1
for i in range(k, 0, -1):
	den = den * i
ans = num // den
for i in range(k - 1, 1, -1):
	ans = ans * i * i
print(ans // 2)


n = int(input())
c = n // 2
s = 1
for i in range(c):
	s = s * (n - i) // (i + 1)
if n == 2:
	a = 1
else:
	a = 1
	for i in range(1, n // 2):
		a = a * i
print(s * a * a // 2)


import sys
from collections import defaultdict as dd
from collections import Counter as cc
from queue import Queue
import math
import itertools
try:
	sys.stdin = open('input.txt', 'r')
	sys.stdout = open('output.txt', 'w')
except:
	pass
input = lambda : sys.stdin.buffer.readline().rstrip()
q = int(input())
w = math.factorial(q) // (2 * math.factorial(q // 2) * math.factorial(q // 2)) * (math.factorial(q // 2 - 1) * math.factorial(q // 2 - 1))
print(w)


from math import factorial
n = int(input())
kek = factorial(n) // factorial(n // 2) // factorial(n // 2) // 2
print(kek * factorial(n // 2) * factorial(n // 2) // (n // 2) // (n // 2))


import sys, os
from io import BytesIO, IOBase
import collections, itertools, bisect, heapq, math, string
from decimal import *
BUFSIZE = 8192
BUFSIZE = 8192

class FastIO(IOBase):
	newlines = 0

	def __init__(self, file):
		self._fd = file.fileno()
		self.buffer = BytesIO()
		self.writable = 'x' in file.mode or 'r' not in file.mode
		self.write = self.buffer.write if self.writable else None

	def read(self):
		while True:
			b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
			if not b:
				break
			ptr = self.buffer.tell()
			(self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
		self.newlines = 0
		return self.buffer.read()

	def readline(self):
		while self.newlines == 0:
			b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
			self.newlines = b.count(b'\n') + (not b)
			ptr = self.buffer.tell()
			(self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
		self.newlines -= 1
		return self.buffer.readline()

	def flush(self):
		if self.writable:
			os.write(self._fd, self.buffer.getvalue())
			(self.buffer.truncate(0), self.buffer.seek(0))

class IOWrapper(IOBase):

	def __init__(self, file):
		self.buffer = FastIO(file)
		self.flush = self.buffer.flush
		self.writable = self.buffer.writable
		self.write = lambda s: self.buffer.write(s.encode('ascii'))
		self.read = lambda : self.buffer.read().decode('ascii')
		self.readline = lambda : self.buffer.readline().decode('ascii')
(sys.stdin, sys.stdout) = (IOWrapper(sys.stdin), IOWrapper(sys.stdout))
input = lambda : sys.stdin.readline().rstrip('\r\n')

def main():
	n = int(input())
	print(math.factorial(2 * (n // 2 - 1) + 1) // (n // 2))
main()


import math
n = int(input())
if n == 2:
	print(1)
elif n == 4:
	print(3)
else:
	print(2 * math.factorial(n) // math.factorial(n // 2) ** 2 * (math.factorial(n // 2) // n) ** 2)


def fact(x):
	c = 1
	for i in range(2, x + 1):
		c *= i
	return c
n = int(input())
k = fact(n) // fact(n // 2) // fact(n // 2)
k //= 2
k *= fact(n // 2 - 1) ** 2
print(k)


def f(n):
	s = 1
	for i in range(1, n + 1):
		s *= i
	return s

def ank(n, k):
	return f(k) // f(k - n)

def cnk(n, k):
	return f(k) // (f(n) * f(k - n))
n = int(input())
print(ank(n // 2, n) // (n // 2) * ank(n // 2, n // 2) // (n // 2) // 2)


dp = [1, 1, 2]
for i in range(3, 21):
	dp.append(dp[-1] * i)
n = int(input())
numer = dp[n]
denom = (n / 2) ** 2
print(int(numer / (denom * 2)))


n = int(input())
a = n * n // 2
out = 1
for i in range(1, n + 1):
	out *= i
print(out // a)


from bisect import *
from collections import *
from math import gcd, ceil, sqrt, floor
from heapq import *
from typing import List
from itertools import *
from operator import add, mul, sub, xor, truediv, floordiv
from functools import *
import os
import sys
from io import BytesIO, IOBase
BUFSIZE = 8192

class FastIO(IOBase):
	newlines = 0

	def __init__(self, file):
		self._fd = file.fileno()
		self.buffer = BytesIO()
		self.writable = 'x' in file.mode or 'r' not in file.mode
		self.write = self.buffer.write if self.writable else None

	def read(self):
		while True:
			b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
			if not b:
				break
			ptr = self.buffer.tell()
			(self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
		self.newlines = 0
		return self.buffer.read()

	def readline(self):
		while self.newlines == 0:
			b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
			self.newlines = b.count(b'\n') + (not b)
			ptr = self.buffer.tell()
			(self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
		self.newlines -= 1
		return self.buffer.readline()

	def flush(self):
		if self.writable:
			os.write(self._fd, self.buffer.getvalue())
			(self.buffer.truncate(0), self.buffer.seek(0))

class IOWrapper(IOBase):

	def __init__(self, file):
		self.buffer = FastIO(file)
		self.flush = self.buffer.flush
		self.writable = self.buffer.writable
		self.write = lambda s: self.buffer.write(s.encode('ascii'))
		self.read = lambda : self.buffer.read().decode('ascii')
		self.readline = lambda : self.buffer.readline().decode('ascii')
(sys.stdin, sys.stdout) = (IOWrapper(sys.stdin), IOWrapper(sys.stdout))
input = lambda : sys.stdin.readline().rstrip('\r\n')

def RL():
	return map(int, sys.stdin.readline().rstrip().split())

def RLL():
	return list(map(int, sys.stdin.readline().rstrip().split()))

def N():
	return int(input())

@lru_cache(None)
def fact(x):
	if x < 2:
		return 1
	return fact(x - 1) * x

@lru_cache(None)
def per(i, j):
	return fact(i) // fact(i - j)

@lru_cache(None)
def com(i, j):
	return per(i, j) // fact(j)

def linc(f, t, l, r):
	while l < r:
		mid = (l + r) // 2
		if t > f(mid):
			l = mid + 1
		else:
			r = mid
	return l

def rinc(f, t, l, r):
	while l < r:
		mid = (l + r + 1) // 2
		if t < f(mid):
			r = mid - 1
		else:
			l = mid
	return l

def ldec(f, t, l, r):
	while l < r:
		mid = (l + r) // 2
		if t < f(mid):
			l = mid + 1
		else:
			r = mid
	return l

def rdec(f, t, l, r):
	while l < r:
		mid = (l + r + 1) // 2
		if t > f(mid):
			r = mid - 1
		else:
			l = mid
	return l

def isprime(n):
	for i in range(2, int(n ** 0.5) + 1):
		if n % i == 0:
			return False
	return True

def binfun(x):
	c = 0
	for w in arr:
		c += ceil(w / x)
	return c

def lowbit(n):
	return n & -n

class BIT:

	def __init__(self, arr):
		self.arr = arr
		self.n = len(arr) - 1

	def update(self, x, v):
		while x <= self.n:
			self.arr[x] += v
			x += x & -x

	def query(self, x):
		ans = 0
		while x:
			ans += self.arr[x]
			x &= x - 1
		return ans

class smt:

	def __init__(self, l, r, arr):
		self.l = l
		self.r = r
		self.value = (1 << 31) - 1 if l < r else arr[l]
		mid = (l + r) // 2
		if l < r:
			self.left = smt(l, mid, arr)
			self.right = smt(mid + 1, r, arr)
			self.value &= self.left.value & self.right.value

	def setvalue(self, x, val):
		if self.l == self.r:
			self.value = val
			return
		mid = (self.l + self.r) // 2
		if x <= mid:
			self.left.setvalue(x, val)
		else:
			self.right.setvalue(x, val)
		self.value = self.left.value & self.right.value

	def ask(self, l, r):
		if l <= self.l and r >= self.r:
			return self.value
		val = (1 << 31) - 1
		mid = (self.l + self.r) // 2
		if l <= mid:
			val &= self.left.ask(l, r)
		if r > mid:
			val &= self.right.ask(l, r)
		return val

class UFS:

	def __init__(self, n):
		self.parent = [i for i in range(n)]
		self.ranks = [0] * n

	def find(self, x):
		if x != self.parent[x]:
			self.parent[x] = self.find(self.parent[x])
		return self.parent[x]

	def union(self, u, v):
		(pu, pv) = (self.find(u), self.find(v))
		if pu == pv:
			return False
		if self.ranks[pu] >= self.ranks[pv]:
			self.parent[pv] = pu
			if self.ranks[pv] == self.ranks[pu]:
				self.ranks[pu] += 1
		else:
			self.parent[pu] = pv

def Prime(n):
	c = 0
	prime = []
	flag = [0] * (n + 1)
	for i in range(2, n + 1):
		if not flag[i]:
			prime.append(i)
			c += 1
		for j in range(c):
			if i * prime[j] > n:
				break
			flag[i * prime[j]] = prime[j]
			if i % prime[j] == 0:
				break
	return prime

def dij(s, graph):
	d = {}
	d[s] = 0
	heap = [(0, s)]
	seen = set()
	while heap:
		(dis, u) = heappop(heap)
		if u in seen:
			continue
		for v in graph[u]:
			if v not in d or d[v] > d[u] + graph[u][v]:
				d[v] = d[u] + graph[u][v]
				heappush(heap, (d[v], v))
	return d

def md(a, b, mod):
	return a * pow(b, mod - 2, mod) % mod
n = N()
ans = per(n, n // 2) // (n // 2) // 2 * per(n // 2, n // 2) // (n // 2)
print(ans)


from itertools import permutations
n = int(input())
a = [i + 1 for i in range(n // 2)]
p = permutations(a)

def rotateLeft(l):
	return l[1:] + l[:1]

def fact(n):
	if n == 0:
		return 1
	return n * fact(n - 1)

def ncr(n, r):
	return fact(n) // (fact(r) * fact(n - r))

def npr(n, r):
	return fact(n) // fact(n - r)
print(ncr(n, n // 2) * fact(n // 2 - 1) ** 2 // 2)


import math
import sys, bisect
from heapq import *
from itertools import *
from collections import *
sys.setrecursionlimit(10 ** 6)
I = lambda : int(sys.stdin.readline())
neo = lambda : map(int, sys.stdin.readline().split())
Neo = lambda : list(map(int, sys.stdin.readline().split()))
n = I()
fact = [1]
for i in range(1, 21):
	fact += [fact[-1] * i]
print(fact[n - 1] // (n // 2))


def factorial(num):
	if num == 1:
		return num
	else:
		return num * factorial(num - 1)
n = int(input())
if n == 2:
	print(1)
else:
	print(int(factorial(n) / (n * n / 2)))


import math
n = int(input())
a = math.factorial(n)
m = pow(n, 2)
ans = int(a * 2 / m)
print(ans)


def fact(n):
	r = 1
	if n == 0 or n == 1:
		return 1
	else:
		for i in range(1, n + 1):
			r = r * i
	return r
n = int(input())
k = n // 2
print(int(fact(n - 1) / k))


fact = [0] * 20
c = [[0 for _ in range(20)] for x in range(20)]
n = int(input())
fact[0] = 1
for i in range(1, 20):
	fact[i] = fact[i - 1] * i
for i in range(20):
	c[i][0] = 1
	c[0][i] = 1
for i in range(1, 20):
	for j in range(1, 20):
		c[i][j] = c[i - 1][j] + c[i][j - 1]
k = n // 2
print(c[k - 1][k] * fact[k - 1] * fact[k - 1])


f = [1]
for i in range(1, 50):
	f.append(f[-1] * i)

def C(n, r):
	return f[n] // (f[r] * f[n - r])
n = int(input())
m = n // 2
print(C(n, m) * f[m - 1] ** 2 // 2)


import sys, math, itertools, collections, copy
input = sys.stdin.readline

def fact(n):
	if n <= 1:
		return 1
	ans = 1
	for i in range(2, n + 1):
		ans *= i
	return ans
n = int(input())
ans = math.factorial(n) // math.factorial(n // 2) * math.factorial(n // 2 - 1) // math.factorial(n // 2) * math.factorial(n // 2 - 1)
print(ans // 2)


c = []
for i in range(24):
	l = []
	for j in range(24):
		l.append(0)
	c.append(l)
c[0][0] = 1
for i in range(1, 22):
	for j in range(0, 22):
		c[i][j] = c[i - 1][j] + c[i - 1][j - 1]
fac = [1]
for i in range(1, 22):
	fac.append(fac[i - 1] * i)
n = int(input())
print(fac[(n >> 1) - 1] * fac[(n >> 1) - 1] * (c[n][n >> 1] >> 1))


x = input()
n = int(x)

def factorial(x):
	if x == 0:
		return 1
	else:
		z = 1
		for i in range(1, x + 1):
			z *= i
		return z
print(factorial(n) * factorial(n // 2 - 1) * factorial(n // 2 - 1) // (2 * factorial(n // 2) * factorial(n // 2)))


def fact(a):
	if a == 1:
		return 1
	else:
		return fact(a - 1) * a
n = int(input())
print(fact(n) // fact(n // 2) // (n // 2) * (fact(n // 2) // (n // 2)) // 2)


n = int(input())
F = [1]
for i in range(1, n + 1):
	F.append(F[-1] * i)

def binom(n, k):
	return F[n] // F[k] // F[n - k]
print(binom(n, n // 2) * F[n // 2 - 1] ** 2 // 2)


fact = [1] * 21
for i in range(1, 21):
	fact[i] = fact[i - 1] * i
n = int(input(''))
ans = fact[n - 1] // (n // 2)
mama = 1
print(ans)


def cont(n):
	if n == 1:
		return n
	else:
		return n * cont(n - 1)
n = int(input())
x = n // 2
print(cont(n) // (x * x * 2))


from math import factorial
for _ in range(1):
	n = int(input())
	print(factorial(n) // (2 * factorial(n // 2) ** 2) * factorial(n // 2 - 1) ** 2)


import sys
import math
import collections
import operator as op
from collections import deque
from math import gcd, inf, sqrt, pi, cos, sin, ceil, log2, floor
from bisect import bisect_right, bisect_left, bisect
from functools import reduce
from sys import stdin, stdout, setrecursionlimit
setrecursionlimit(2 ** 20)

def ncr(n, r):
	r = min(r, n - r)
	numer = reduce(op.mul, range(n, n - r, -1), 1)
	denom = reduce(op.mul, range(1, r + 1), 1)
	return numer // denom

def prime_factors(n):
	i = 2
	factors = []
	while i * i <= n:
		if n % i:
			i += 1
		else:
			n //= i
			factors.append(i)
	if n > 1:
		factors.append(n)
	return list(factors)

def sumDigits(no):
	return 0 if no == 0 else int(no % 10) + sumDigits(int(no / 10))
MOD = 1000000007
PMOD = 998244353
N = 10 ** 9 + 7
LOGN = 30
T = 1
F = [1] * (20 + 1)
for i in range(1, 20 + 1):
	F[i] = F[i - 1] * i
for _ in range(T):
	n = int(stdin.readline())
	print(F[n] // (n * (n // 2)))


def nCr(n, r):
	return fact(n) / (fact(r) * fact(n - r))

def fact(n):
	res = 1
	for i in range(2, n + 1):
		res = res * i
	return res
n = int(input())
n1 = n // 2
c1 = int(nCr(n, n1))
facti = int(fact(n1 - 1))
print(c1 * facti ** 2 // 2)


x = int(input())
val = 1
for i in range(x - 1):
	val = val * (i + 1)
val = val / (x / 2)
print(int(val))


def nCr(n, r):
	if r == 0:
		return 1
	if r == n:
		return 1
	(num, den) = (1, 1)
	for i in range(n, r, -1):
		num = num * i
		if i - r != 0:
			den = den * (i - r)
	return int(num / den)

def factorial(n):
	if n == 0:
		return 1
	else:
		return n * factorial(n - 1)
inp = int(input())
sec = int(inp / 2)
first = nCr(inp, sec)
second = factorial(sec - 1)
print(int(first * second * second / 2))


import math
n = int(input())
p = math.factorial(n)
u = n ** 2 // 2
print(p // u)


def R():
	return map(int, input().split())

def L():
	return list(map(int, input().split()))

def I():
	return int(input())

def fact(x):
	prod = 1
	for i in range(1, x + 1):
		prod *= i
	return prod
n = I()
k = n // 2
print(fact(k - 1) ** 2 * fact(n) // 2 // fact(k) ** 2)


def c(n, m):
	up = 1
	bottom = 1
	for i in range(n + 1 - m, n + 1):
		up *= i
	for i in range(1, m + 1):
		bottom *= i
	return up // bottom

def s(n):
	ret = 1
	for i in range(1, n + 1):
		ret *= i
	return ret
n = int(input())
print(c(n, n // 2) // 2 * s(n // 2 - 1) ** 2)


n = int(input())
fac1 = 1
fac2 = 1
fac3 = 1
for i in range(1, n + 1):
	fac1 *= i
	if i <= n // 2:
		fac2 *= i
	if i <= n // 2 - 1:
		fac3 *= i
groups = fac1 // (fac2 * fac2)
groups = groups // 2
print(groups * fac3 ** 2)


n = int(input())
nf = 1
for i in range(1, n + 1):
	nf *= i
print(2 * nf // (n * n))


n = int(input())
k = n / 2
r = 1
for i in range(n, 1, -1):
	r *= i
r //= k
r //= k
r //= 2
print('%d' % r)


import math

def calculateFactorial(z):
	result = 1
	for i in range(1, z + 1):
		result *= i
	return result

def calculateBinomial(n, k):
	return calculateFactorial(n) / (calculateFactorial(k) * calculateFactorial(n - k))
n = int(input())
waysToChoose = calculateBinomial(n, int(n / 2)) / 2
validPermutations = (calculateFactorial(int(n / 2)) / int(n / 2)) ** 2
ans = waysToChoose * validPermutations
print(int(ans))


import sys
import math
from collections import defaultdict, deque
input = sys.stdin.readline

def inar():
	return [int(el) for el in input().split()]

def main():
	n = int(input())
	ans = 1
	lol = 1
	dic = defaultdict(int)
	for i in range(2, n // 2 + 1):
		dic[i] += 1
		lol *= i
	for i in range(n, n // 2, -1):
		ans *= i
		for j in dic.keys():
			if dic[j] > 0 and ans % j == 0:
				ans //= j
				dic[j] = 0
	now = lol // (n // 2)
	ans //= 2
	print(ans * now ** 2)
main()


n = int(input())

def fact(n):
	if n == 0 or n == 1:
		return 1
	return n * fact(n - 1)
a = fact(n)
b = fact(n / 2)
c = fact(n / 2 - 1)
print(int(a / (2 * b * b) * (c * c)))


n = 0
n = int(input())
fact = 1
m = n / 2
for i in range(1, n + 1):
	if i == m + 1:
		result2 = fact
	fact = fact * i
result = fact
print(int(result / (n * m)))


n = int(input())
val = 1
for i in range(1, n + 1):
	val *= i
out = val // (2 * (n // 2) * (n // 2))
print(out)


def g(n):
	a = 1
	k = n
	n = 2 * n + 1
	while n:
		a *= n
		n -= 1
	return a // (k + 1)
n = int(input())
n //= 2
print(g(n - 1))


def fact(n):
	u = 1
	for x in range(1, n + 1):
		u *= x
	return u
n = int(input())
print(fact(n - 1) // (n // 2))


ans = [0, 1, 1, 1, 3, 8, 40, 180, 1260, 8064, 72576, 604800, 6652800, 68428800, 889574400, 10897286400, 163459296000, 2324754432000, 39520825344000, 640237370572800, 12164510040883200]
n = int(input())
print(ans[n])


import math

def main():
	n = int(input())
	r = n // 2
	totalGroups = math.factorial(n) / (math.factorial(r) * math.factorial(n - r))
	totalGroups //= 2
	singleGroupArr = math.factorial(r - 1)
	finalAnswer = totalGroups * singleGroupArr * singleGroupArr
	print(int(finalAnswer))
main()


n = int(input())
q = 1
for i in range(1, n + 1):
	q *= i
print(2 * q // n ** 2)


from math import factorial as fact
n = int(input())
c = fact(n) // (fact(n // 2) * fact(n // 2))
ans = c * fact(n // 2) * fact(n // 2) // (2 * (n // 2) * (n // 2))
print(ans)


n = int(input())
m = n // 2
tot = 1
for i in range(n, m, -1):
	tot *= i
dances = 1
for i in range(1, m):
	dances *= i
print(tot // 2 * dances // m)


def fac(a):
	res = 1
	for i in range(1, a + 1):
		res *= i
	return res

def C(n, k):
	return int(fac(n) / (fac(k) * fac(n - k)))
n = int(input())
print(C(n, n // 2) * fac(n // 2 - 1) ** 2 // 2)


from math import *
sInt = lambda : int(input())
mInt = lambda : map(int, input().split())
lInt = lambda : list(map(int, input().split()))
t = sInt()
print(factorial(t - 1) // (t // 2))


def fatorial(n: int):
	ans = 1
	for i in range(1, n + 1):
		ans *= i
	return ans
T = 1
while T:
	T -= 1
	n = int(input())
	nfa = fatorial(n)
	nfah = fatorial(n // 2)
	ans = nfa // nfah
	ans = ans // nfah
	h = fatorial(n // 2 - 1)
	ans *= h * h
	ans //= 2
	print(ans)


import sys
import bisect as bi
import collections as cc
import heapq as hp
input = sys.stdin.readline
fact = [1]
for i in range(1, 100):
	fact.append(i * fact[-1])
I = lambda : list(map(int, input().split()))
for tc in range(1):
	(n,) = I()
	print(fact[n - 1] // (n // 2))


def nCr(n, r):
	num = fact(n)
	denom = fact(r) * fact(n - r)
	return num / denom

def fact(n):
	res = 1
	for i in range(1, n + 1):
		res = res * i
	return int(res)
t = 1
while t > 0:
	n = int(input())
	x = int(n / 2)
	ans = int(nCr(n, x))
	ans /= 2
	y = fact(x - 1)
	ans = ans * y * y
	print(int(ans))
	t -= 1


n = int(input())
n //= 2
n -= 1
f = lambda x: x < 2 or x * f(x - 1)
print(f(2 * n + 1) // (n + 1))


import sys, math
import io, os
from collections import defaultdict as dd, deque, Counter

def data():
	return sys.stdin.readline().strip()

def mdata():
	return list(map(int, data().split()))

def outl(var):
	sys.stdout.write('\n'.join(map(str, var)) + '\n')

def out(var):
	sys.stdout.write(str(var) + '\n')
mod = int(1000000000.0) + 7
n = int(data())
f = [1]
for i in range(1, n + 1):
	f.append(f[-1] * i)
out(f[n] * f[n // 2 - 1] * f[n // 2 - 1] // f[n // 2] ** 2 // 2)


import math
x = int(input())
y = math.factorial(x)
z = y * 2 / x ** 2
print(int(z))


from math import *
f = 1
fact = []
fact.append(f)
for i in range(1, 21):
	f = f * i
	fact.append(f)
n = int(input())
l = n // 2
l = l - 1
ans = fact[l] * fact[l]
k = fact[n] // (fact[n // 2] * fact[n // 2])
ans = ans * (k // 2)
print(ans)


n = int(input())
ans = 1
count = n
a = 1
b = 1
c = 1
d = 1
while count >= 1:
	a = a * count
	count = count - 1
count = n // 2
while count >= 1:
	b = b * count
	count = count - 1
ans = ans * a
ans = ans // b
ans = ans // b
c = b // (n // 2)
c = c * c
ans = ans * c
ans = ans / 2
ans = int(ans)
print(ans)


import math
n = int(input())
nn = int(n / 2)
print(int(math.factorial(n) / math.factorial(nn) / math.factorial(nn) / 2 * math.factorial(nn - 1) * math.factorial(nn - 1)))


def f(n):
	cnt = 1
	for i in range(n):
		cnt *= i + 1
	return cnt

def c(n, k):
	now = f(n)
	now //= f(n - k)
	now //= f(k)
	return now
n = int(input())
print(f(n // 2 - 1) ** 2 * c(n, n // 2) // 2)


def nCr(n, r):
	return fact(n) / (fact(r) * fact(n - r))

def fact(n):
	res = 1
	for i in range(2, n + 1):
		res = res * i
	return res
import math
n = int(input())
print(int(nCr(n, int(n / 2)) * fact(int(n / 2) - 1) * fact(int(n / 2) - 1) / 2))


n = int(input())
i = n - 1
r = 2
while i:
	r *= i
	i -= 1
print(int(r / n))


import sys
input = sys.stdin.readline
a = int(input())
f = 1
for i in range(1, a + 1):
	f *= i
b = a // 2
c = b * a
print(f // c)


import sys
input = sys.stdin.readline
ans = 1
A = [1]
for i in range(1, 21):
	ans = ans * i
	A.append(ans)

def main():
	n = int(input())
	v = A[n] // A[n // 2] ** 2
	v = v // 2
	val = A[n // 2 - 1] ** 2
	print(v * val)
main()


import math
n = int(input())
z = math.factorial(n)
x = n ** 2
y = x / 2
u = z / y
print(int(u))


def solve():
	n = int(input())
	(k, prod) = (n / 2, 1)
	for i in range(1, n):
		if i == k:
			continue
		prod *= i
	print(prod)
solve()


import sys
import math
import bisect
from sys import stdin, stdout
from math import gcd, floor, sqrt, log2, ceil
from collections import defaultdict as dd
from bisect import bisect_left as bl, bisect_right as br
from bisect import insort
from collections import Counter
from collections import deque
from heapq import heappush, heappop, heapify
from itertools import permutations, combinations
mod = int(1000000000.0) + 7
ip = lambda : int(stdin.readline())
inp = lambda : map(int, stdin.readline().split())
ips = lambda : stdin.readline().rstrip()
out = lambda x: stdout.write(str(x) + '\n')
fac = [0] * 21
fac[0] = 1
f = 1
for i in range(1, 21):
	f *= i
	fac[i] = f

def ncr(n, r):
	return fac[n] // (fac[r] * fac[n - r])
t = 1
for _ in range(t):
	n = ip()
	if n == 2:
		ans = 1
	else:
		ans = ncr(n, n // 2) // 2
		ans *= fac[n // 2] // (n // 2)
		ans *= fac[n // 2] // (n // 2)
	out(ans)


from math import factorial

def solve(n):
	return factorial(n) // factorial(n // 2) ** 2 * factorial(n // 2 - 1) ** 2 // 2
n = int(input())
if n == 2:
	print(1)
else:
	print(solve(n))


import sys, math
from collections import deque, defaultdict
import operator as op
from functools import reduce
I = sys.stdin.readline

def ii():
	return int(I().strip())

def li():
	return list(map(int, I().strip().split()))

def mi():
	return map(int, I().strip().split())

def ncr(n, r):
	r = min(r, n - r)
	numer = reduce(op.mul, range(n, n - r, -1), 1)
	denom = reduce(op.mul, range(1, r + 1), 1)
	return numer // denom

def gcd(x, y):
	while y:
		(x, y) = (y, x % y)
	return x

def valid(row, col, rows, cols, rcross, lcross):
	return rows[row] == 0 and cols[col] == 0 and (rcross[col + row] == 0) and (lcross[col - row] == 0)

def main():
	n = ii()
	select = ncr(n, n // 2) // 2
	ans = select * math.factorial(n // 2 - 1) ** 2
	print(ans)
main()


def fact(n):
	res = 1
	for i in range(2, n + 1):
		res = res * i
	return res

def nCr(n, r):
	return fact(n) / (fact(r) * fact(n - r))
n = int(input())
if n == 2:
	print(1)
else:
	x = fact(n // 2 - 1)
	ans = int(nCr(n, n // 2) * x * x * 0.5)
	print(ans)


def fac(n):
	factorial = 1
	for i in range(1, n + 1):
		factorial = factorial * i
	return factorial
n = int(input())
p1 = fac(n) // fac(n // 2) ** 2
p2 = fac(n // 2 - 1)
ans = p1 * p2 ** 2 // 2
print(ans)


n = int(input())
if n == 2:
	print(1)
elif n == 4:
	print(3)
else:
	result = 1
	for x in range(n // 2 + 1, n + 1):
		result *= x
	result = result // (2 * (n // 2))
	rest = 1
	for x in range(1, n // 2 + 1):
		rest *= x
	rest = rest // (2 * (n // 2))
	print(result * rest * 2)


n = int(input())
n = (n - 2) // 2
m = 2 * n + 1
fact = 1
while m:
	fact = fact * m
	m -= 1
fact //= n + 1
print(fact)


def factorial(n):
	if n == 0:
		return 1
	else:
		return n * factorial(n - 1)

def combination(n, r):
	return factorial(n) // (factorial(r) * factorial(n - r))
n = int(input())
print(combination(n, n // 2) // 2 * factorial(n // 2 - 1) * factorial(n // 2 - 1))


from math import *
import os
import random
import re
import sys
from itertools import *
n = int(input())
print(int(factorial(n) / (pow(n / 2, 2) * 2)))


import sys
from collections import deque
from itertools import permutations as prm, product

def eprint(*args):
	print(*args, file=sys.stderr)
zz = 1
if zz:
	input = sys.stdin.readline
else:
	sys.stdin = open('input.txt', 'r')
	sys.stdout = open('all.txt', 'w')
di = [[-1, 0], [1, 0], [0, 1], [0, -1]]

def string(s):
	return ''.join(s)

def fori(n):
	return [fi() for i in range(n)]

def inc(d, c, x=1):
	d[c] = d[c] + x if c in d else x

def bo(i):
	return ord(i) - ord('A')

def li():
	return [int(xx) for xx in input().split()]

def fli():
	return [float(x) for x in input().split()]

def comp(a, b):
	if a > b:
		return 2
	return 2 if a == b else 0

def gi():
	return [xx for xx in input().split()]

def cil(n, m):
	return n // m + int(n % m > 0)

def fi():
	return int(input())

def pro(a):
	return reduce(lambda a, b: a * b, a)

def swap(a, i, j):
	(a[i], a[j]) = (a[j], a[i])

def si():
	return list(input().rstrip())

def mi():
	return map(int, input().split())

def gh():
	sys.stdout.flush()

def isvalid(i, j, n, m):
	return 0 <= i < n and 0 <= j < m

def bo(i):
	return ord(i) - ord('a')

def graph(n, m):
	for i in range(m):
		(x, y) = mi()
		a[x].append(y)
		a[y].append(x)
n = fi()
fact = [1] * 25
for i in range(1, n + 1):
	fact[i] = i * fact[i - 1]
print(fact[n] // fact[n // 2] ** 2 * fact[n // 2 - 1] ** 2 // 2)


n = int(input())
n -= 2
n //= 2
res = 1
for i in range(2, 2 * n + 2):
	if i == n + 1:
		continue
	res *= i
print(res)


def inp():
	return int(input())

def inlt():
	return list(map(int, input().split()))

def insr():
	s = input()
	return list(s[:len(s)])

def invr():
	return map(int, input().split())

def fact(n, i):
	if n == 1 or n == 0:
		return 1
	elif n == i:
		return i
	else:
		return n * fact(n - 1, i)
n = inp()
half_group_ways = fact(n, n / 2 + 1) / fact(n / 2, 1)
group_order = fact(n / 2, 1) / (n / 2)
print(int(half_group_ways * group_order * group_order / 2))


def ncr(n, r):
	return factorial(n) // (factorial(r) * factorial(n - r))

def factorial(n):
	if n == 0:
		return 1
	else:
		init = 1
		for i in range(1, n + 1):
			init *= i
		return init
n = int(input())
d = n // 2
ways = factorial(d - 1)
combination = ncr(n, d) // 2
ans = combination * ways * ways
print(ans)


import math
n = int(input())
a = 1
for i in range(n, n // 2, -1):
	a *= i
b = math.factorial(n // 2)
print(a // (b * 2) * math.factorial(n // 2 - 1) * math.factorial(n // 2 - 1))


import math
import os
import random
import re
import sys
import operator as op
from functools import reduce

def ncr(n, r):
	r = min(r, n - r)
	numer = reduce(op.mul, range(n, n - r, -1), 1)
	denom = reduce(op.mul, range(1, r + 1), 1)
	return numer // denom
n = int(input())
if n == 2:
	print(1)
else:
	x = ncr(n, n // 2)
	y = n // 2
	z = math.factorial(y - 1)
	print(x * z * z // 2)


from math import *
a = int(input())
j = factorial(a) / factorial(int(a / 2)) / factorial(int(a / 2))
print(int(j * int(factorial(int(a / 2) - 1) ** 2) / 2))


from sys import stdout
from sys import stdin

def get():
	return stdin.readline().strip()

def getf():
	return [int(i) for i in get().split()]

def put(a, end='\n'):
	stdout.write(str(a) + end)

def putf(a, sep=' ', end='\n'):
	stdout.write(sep.join([str(i) for i in a]) + end)
from math import ceil, gcd, factorial as fac

def cnt(k):
	if k < 3:
		return 1
	return fac(k - 1)

def main():
	n = int(get())
	k = n // 2
	K = cnt(k)
	N = fac(n - 1) // fac(k)
	print(K * N)
main()


from math import factorial as fac
n = int(input())
print(fac(n) // (n // 2) // (n // 2) // 2)


import math
n = int(input())
k = n / 2
nu = math.factorial(n)
den = 2 * (n // 2) ** 2
ans = int(nu / den)
print(ans)


n = int(input())
result = 1
for j in range(n + 1)[n // 2 + 1:]:
	result *= j
for j in range(1, n // 2 + 1):
	result //= j
for j in range(1, n // 2):
	result *= j * j
print(result // 2)


n = int(input())
ans = 1
for j in range(2, n + 1):
	ans *= j
d = n * (n // 2)
print(ans // d)


n = int(input())

def fact(k):
	if k == 1:
		return 1
	else:
		return k * fact(k - 1)
print(2 * fact(n - 1) // n)


n = int(input())
import math
c = math.comb
f = math.factorial
print(c(n, n // 2) * f(n // 2 - 1) ** 2 // 2)


def f(n):
	out = 1
	for i in range(2, n + 1):
		out *= i
	return out
n = int(input())
n = n // 2 - 1
print(f(2 * n + 1) // (n + 1))


def factorial(n):
	if n == 1:
		return 1
	ar = [1]
	for i in range(2, n + 1):
		ar.append(i * ar[i - 2])
	return ar[n - 1]
n = int(input())
groups = factorial(n) // (2 * factorial(n // 2) * factorial(n // 2))
one_group = factorial(n // 2 - 1)
b = one_group * groups
print(b * one_group)


from math import factorial as fact
n = int(input())
answer = fact(n) / (2 * (n / 2) ** 2)
print(int(answer))


import os
import sys
from io import BytesIO, IOBase
import math
from itertools import permutations
from decimal import *
getcontext().prec = 25
MOD = pow(10, 9) + 7
BUFSIZE = 8192

class FastIO(IOBase):
	newlines = 0

	def __init__(self, file):
		self._fd = file.fileno()
		self.buffer = BytesIO()
		self.writable = 'x' in file.mode or 'r' not in file.mode
		self.write = self.buffer.write if self.writable else None

	def read(self):
		while True:
			b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
			if not b:
				break
			ptr = self.buffer.tell()
			(self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
		self.newlines = 0
		return self.buffer.read()

	def readline(self):
		while self.newlines == 0:
			b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
			self.newlines = b.count(b'\n') + (not b)
			ptr = self.buffer.tell()
			(self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
		self.newlines -= 1
		return self.buffer.readline()

	def flush(self):
		if self.writable:
			os.write(self._fd, self.buffer.getvalue())
			(self.buffer.truncate(0), self.buffer.seek(0))

class IOWrapper(IOBase):

	def __init__(self, file):
		self.buffer = FastIO(file)
		self.flush = self.buffer.flush
		self.writable = self.buffer.writable
		self.write = lambda s: self.buffer.write(s.encode('ascii'))
		self.read = lambda : self.buffer.read().decode('ascii')
		self.readline = lambda : self.buffer.readline().decode('ascii')
(sys.stdin, sys.stdout) = (IOWrapper(sys.stdin), IOWrapper(sys.stdout))
input = lambda : sys.stdin.readline().rstrip('\r\n')
n = int(input())
a = 1
for i in range(1, n + 1):
	a *= i
print(a // (n * (n // 2)))


N = 21
f = [0] * N
n = int(input())
f[0] = 1
for i in range(1, N):
	f[i] = f[i - 1] * i
ans = f[n] // f[n // 2] // f[n // 2]
ans = ans * f[n // 2 - 1]
ans = ans * f[n // 2 - 1]
ans /= 2
print(int(ans))


def fact(n):
	sm = 1
	for k in range(1, n + 1):
		sm *= k
	return sm
n = int(input())
print(fact(n) // (n * (n // 2)))


k = int(input()) // 2
s = 1
for i in range(1, 2 * k):
	s *= i
print(s // k)


a = int(input())
p = 1
for i in range(1, a):
	p = p * i
print(p // (a // 2))


import sys
inp = int(sys.stdin.readline())
out = 2
for i in range(1, inp + 1):
	out *= i
out = out / inp ** 2
sys.stdout.write(str(int(out)))


a = input()
ans = 1
for i in range(1, int(a) + 1):
	ans *= i
print(ans // (int(a) * int(a) // 2))


import math
from collections import deque
from sys import stdin, stdout, setrecursionlimit
from string import ascii_letters
letters = ascii_letters[:26]
from collections import defaultdict
input = stdin.readline
n = int(input())
res = 1
for i in range(1, n + 1):
	res *= i
print(res // (n * ((n - 2) // 2 + 1)))


t = int(input())
fac = 1
for i in range(1, t + 1):
	fac *= i
print(2 * fac // (t * t))


def fatorial(n):
	soma = 1
	for i in range(1, n + 1):
		soma = soma * i
	return soma
n = int(input())
PermCirc = fatorial(n - 1) // (n // 2)
print(PermCirc)


a = [1, 1, 1, 3, 8, 40, 180, 1260, 8064, 72576, 604800, 6652800, 68428800, 889574400, 10897286400, 163459296000, 2324754432000, 39520825344000, 640237370572800, 12164510040883200]
print(a[int(input()) - 1])


x = int(input())
fac = [1]
for n in range(1, x + 1):
	fac.append(fac[-1] * n)
a = fac[x] // (fac[x // 2] * fac[x // 2])
b = fac[x // 2 - 1]
print(a * b * b // 2)


def fac(n):
	ret = 1
	for i in range(n):
		ret = ret * (i + 1)
	return ret

def ncr(n, r):
	num = fac(n)
	den1 = fac(r)
	den2 = fac(n - r)
	den = den1 * den2
	num = num // den
	return num
n = int(input())
ans = ncr(n, n // 2)
ans = ans // 2
tmp = fac(n // 2 - 1)
ans = ans * tmp * tmp
print(ans)


import sys
input = sys.stdin.readline
import math
n = int(input())
r = n // 2 - 1
n -= 1
a = math.factorial(n) // (math.factorial(n - r) * math.factorial(r))
print(a * math.factorial(r) ** 2)


import sys
from math import factorial

def input():
	return sys.stdin.readline().strip()

def list2d(a, b, c):
	return [[c for j in range(b)] for i in range(a)]

def list3d(a, b, c, d):
	return [[[d for k in range(c)] for j in range(b)] for i in range(a)]

def list4d(a, b, c, d, e):
	return [[[[e for l in range(d)] for k in range(c)] for j in range(b)] for i in range(a)]

def ceil(x, y=1):
	return int(-(-x // y))

def INT():
	return int(input())

def MAP():
	return map(int, input().split())

def LIST(N=None):
	return list(MAP()) if N is None else [INT() for i in range(N)]

def Yes():
	print('Yes')

def No():
	print('No')

def YES():
	print('YES')

def NO():
	print('NO')
INF = 10 ** 19
MOD = 10 ** 9 + 7
EPS = 10 ** (-10)

def nCr(n, r):
	from math import factorial
	if n < r:
		return 0
	r = min(r, n - r)
	return factorial(n) // (factorial(r) * factorial(n - r))
N = INT()
ans = nCr(N, N // 2) * factorial(N // 2 - 1) ** 2 // 2
print(ans)


n = int(input())

def fact(n):
	res = 1
	for i in range(2, n + 1):
		res *= i
	return res
z = n // 2
ans = fact(n)
p = fact(z - 1)
ans *= p * p
ans /= fact(z)
ans /= fact(z)
ans /= 2
print(int(ans))


def fac(n):
	if n == 0 or n == 1:
		return 1
	return n * fac(n - 1)
n = int(input())
r = n // 2
full = fac(n) // (fac(r) * fac(n - r)) // 2
arrangements = fac(n // 2 - 1)
print(full * arrangements * arrangements)


n = int(input())
from math import factorial as f
ans = f(n) // (2 * f(n // 2) * f(n // 2)) * pow(f(n // 2 - 1), 2)
print(ans)


def fac(c):
	t = 1
	for i in range(1, c + 1):
		t *= i
	return t
n = int(input())
f = fac(n) // fac(n // 2)
d = fac(n // 2)
print(f // (n // 2) * (d // (n // 2)) // 2)


from math import factorial as fact
n = int(input())
k = n // 2
comb = fact(n) // (2 * fact(k) * fact(n - k))
foo = fact(k - 1) * fact(k - 1)
print(comb * foo)


import math
n = int(input())
x = n // 2
m = math.factorial(n) // (math.factorial(x) * math.factorial(x))
s = m * math.factorial(x - 1) * math.factorial(x - 1)
s = s // 2
print(s)


import os
from heapq import heapify, heappop, heappush
import sys
import math
import operator
import bisect
from collections import defaultdict
from io import BytesIO, IOBase
sys.setrecursionlimit(10 ** 5)

def inpt():
	return [int(k) for k in input().split()]

def main():
	n = int(input())
	ans = 1
	temp = 1
	d = defaultdict(int)
	for i in range(2, n // 2 + 1):
		d[i] += 1
		temp *= i
	for i in range(n, n // 2, -1):
		ans *= i
		for i in d.keys():
			if d[i] > 0 and ans % i == 0:
				ans //= i
				d[i] = 0
	tp = temp // (n // 2)
	ans //= 2
	ans *= tp ** 2
	print(ans)
BUFSIZE = 8192

class FastIO(IOBase):
	newlines = 0

	def __init__(self, file):
		self._fd = file.fileno()
		self.buffer = BytesIO()
		self.writable = 'x' in file.mode or 'r' not in file.mode
		self.write = self.buffer.write if self.writable else None

	def read(self):
		while True:
			b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
			if not b:
				break
			ptr = self.buffer.tell()
			(self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
		self.newlines = 0
		return self.buffer.read()

	def readline(self):
		while self.newlines == 0:
			b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
			self.newlines = b.count(b'\n') + (not b)
			ptr = self.buffer.tell()
			(self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
		self.newlines -= 1
		return self.buffer.readline()

	def flush(self):
		if self.writable:
			os.write(self._fd, self.buffer.getvalue())
			(self.buffer.truncate(0), self.buffer.seek(0))

class IOWrapper(IOBase):

	def __init__(self, file):
		self.buffer = FastIO(file)
		self.flush = self.buffer.flush
		self.writable = self.buffer.writable
		self.write = lambda s: self.buffer.write(s.encode('ascii'))
		self.read = lambda : self.buffer.read().decode('ascii')
		self.readline = lambda : self.buffer.readline().decode('ascii')
(sys.stdin, sys.stdout) = (IOWrapper(sys.stdin), IOWrapper(sys.stdout))
input = lambda : sys.stdin.readline().rstrip('\r\n')
main()


from math import perm

def nDifferentRoundDances(n):
	return perm(n - 1) // (n // 2)
print(nDifferentRoundDances(int(input())))


import bisect
import math

def solve(n):
	f = math.factorial(n - 1)
	return int(f / (n / 2))
	pass
t = 1
ans = []
for i in range(t):
	n = int(input())
	ans.append(solve(n))
for test in ans:
	print(test)


import math

def nCr(n, r):
	f = math.factorial
	return f(n) // f(r) // f(n - r)

def fact(n):
	fact = [0] * (n + 1)
	fact[0] = 1
	fact[1] = 1
	for i in range(2, n + 1):
		fact[i] = i * fact[i - 1]
	return fact[-1]

def solve(n):
	if n == 2:
		return 1
	nu = nCr(n, n // 2) // 2
	d = fact(n // 2 - 1)
	return nu * d ** 2
n = int(input())
print(solve(n))


from math import factorial
n = int(input())
F = factorial(n) // (factorial(n // 2) * factorial(n // 2)) // 2
Z = factorial(n // 2 - 1) ** 2
print(F * Z)


import math
n = int(input())
r = n // 2
m = math.factorial(n) // (math.factorial(r) * math.factorial(r))
ans = m * math.factorial(r - 1) * math.factorial(r - 1)
ans = ans // 2
print(ans)


import sys

def rs():
	return sys.stdin.readline().rstrip()

def ri():
	return int(sys.stdin.readline())

def ria():
	return list(map(int, sys.stdin.readline().split()))

def ws(s):
	sys.stdout.write(s + '\n')

def wi(n):
	sys.stdout.write(str(n) + '\n')

def wia(a):
	sys.stdout.write(' '.join([str(x) for x in a]) + '\n')
import math
from collections import defaultdict
n = ri()
wi(math.factorial(n) // (n * n // 2))


from sys import stdin, stdout
import math, sys, heapq
from itertools import permutations, combinations
from collections import defaultdict, deque, OrderedDict
from os import path
import random
import bisect as bi

def yes():
	print('YES')

def no():
	print('NO')
if path.exists('input.txt'):
	sys.stdin = open('input.txt', 'r')
	sys.stdout = open('output.txt', 'w')

	def I():
		return int(input())

	def In():
		return map(int, input().split())
else:

	def I():
		return int(stdin.readline())

	def In():
		return map(int, stdin.readline().split())

def dict(a):
	d = {}
	for x in a:
		if d.get(x, -1) != -1:
			d[x] += 1
		else:
			d[x] = 1
	return d

def find_gt(a, x):
	i = bi.bisect_left(a, x)
	if i != len(a):
		return i
	else:
		return -1

def main():
	try:
		dp = [1]
		n = I()
		p = math.factorial(n // 2 - 1)
		n -= 1
		for x in range(n // 2):
			dp.append(dp[-1] * n)
			n -= 1
		print(dp[-1] * p)
	except:
		pass
M = 998244353
P = 1000000007
for _ in range(1):
	main()


N = int(input())
Ans = 1
count = 1
for j in range(N, int(N / 2), -1):
	Ans *= j
	Ans /= count
	count += 1
for k in range(int(N / 2) - 1, 0, -1):
	Ans *= k
	Ans *= k
print(int(Ans / 2))


from itertools import permutations
from collections import defaultdict
from math import *
import os
import sys
from io import BytesIO, IOBase
from heapq import nlargest
from bisect import *
import copy
import itertools
BUFSIZE = 8192

class FastIO(IOBase):
	newlines = 0

	def __init__(self, file):
		self._fd = file.fileno()
		self.buffer = BytesIO()
		self.writable = 'x' in file.mode or 'r' not in file.mode
		self.write = self.buffer.write if self.writable else None

	def read(self):
		while True:
			b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
			if not b:
				break
			ptr = self.buffer.tell()
			(self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
		self.newlines = 0
		return self.buffer.read()

	def readline(self):
		while self.newlines == 0:
			b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
			self.newlines = b.count(b'\n') + (not b)
			ptr = self.buffer.tell()
			(self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
		self.newlines -= 1
		return self.buffer.readline()

	def flush(self):
		if self.writable:
			os.write(self._fd, self.buffer.getvalue())
			(self.buffer.truncate(0), self.buffer.seek(0))

class IOWrapper(IOBase):

	def __init__(self, file):
		self.buffer = FastIO(file)
		self.flush = self.buffer.flush
		self.writable = self.buffer.writable
		self.write = lambda s: self.buffer.write(s.encode('ascii'))
		self.read = lambda : self.buffer.read().decode('ascii')
		self.readline = lambda : self.buffer.readline().decode('ascii')
(sys.stdin, sys.stdout) = (IOWrapper(sys.stdin), IOWrapper(sys.stdout))

def input():
	return sys.stdin.readline().rstrip('\r\n')

def calc(n):
	val = n // 2
	ans = 1
	for i in range(1, n + 1):
		ans *= i
	print(int(ans / (n * val)))
n = int(input())
calc(n)


import sys
input = sys.stdin.readline
x = int(input())
li = [i for i in range(1, 21)]
for i in range(2, 20):
	li[i] *= li[i - 1]
print(2 * li[x - 2] // x)


import sys
import math

def get_ints():
	return map(int, sys.stdin.readline().strip().split())

def get_list():
	return list(map(int, sys.stdin.readline().strip().split()))

def get_string():
	return sys.stdin.readline().strip()
for t in range(1):
	n = int(input())
	if n == 20:
		print(12164510040883200)
	elif n == 2:
		print(1)
	elif n == 4:
		print(3)
	elif n == 8:
		print(1260)
	else:
		print(math.factorial(n) // (2 * (n // 2) ** 2))


n = int(input())
x = 1
xx = 1
for i in range(1, n + 1):
	x = x * i
for i in range(1, n // 2 + 1):
	xx = xx * i
a = x // xx // xx
a = a * xx * xx // (n // 2) // (n // 2)
a = a // 2
print(a)


from sys import stdin, stdout
import math
import heapq
import collections
input = stdin.readline

def inputnum():
	return int(input())

def inputnums():
	return map(int, input().split())

def inputlist():
	return list(map(int, input().split()))

def inputstring():
	return [x for x in input()]

def inputstrings():
	return [x for x in input().split()]

def inputstringnum():
	return [ord(x) - ord('a') for x in input()]

def inputmatrixchar(rows):
	arr2d = [[j for j in input().strip()] for i in range(rows)]
	return arr2d

def inputmatrixint(rows):
	arr2d = []
	for _ in range(rows):
		arr2d.append([int(i) for i in input().split()])
	return arr2d
n = inputnum()
ans = 1
for i in range(2, n):
	if i != n / 2:
		ans *= i
print(ans)


def permutate(n, r):
	return F(n) // (F(n - r) * F(r))

def fuck(n):
	return F(n)

def F(n):
	ans = 1
	for i in range(2, n + 1):
		ans *= i
	return ans
n = int(input())
d = permutate(n, n // 2) * F(n // 2 - 1) * F(n // 2 - 1)
print(d // 2)


n = int(input())

def fact(n):
	ans = 1
	while n > 0:
		ans = ans * n
		n -= 1
	return ans
a = fact(n) / (fact(n / 2) * fact(n / 2))
b = fact(n / 2 - 1)
print(int(a * b * b / 2))


def f(n):
	i = 1
	res = 1
	while i < n:
		i += 1
		res *= i
	return res

def c(n, k):
	return f(n) // (f(k) * f(n - k))
n = int(input())
a = c(n, n // 2)
a //= 2
a *= f(n // 2) // (n // 2)
a *= f(n // 2) // (n // 2)
print(a)


n = int(input())
fact = 1
for i in range(1, n + 1):
	fact *= i
k = n // 2
factK = 1
for i in range(1, k + 1):
	factK *= i
print(fact * factK * factK // (2 * factK * factK * k * k))


from __future__ import division, print_function
import os, sys
from io import BytesIO, IOBase
if sys.version_info[0] < 3:
	from __builtin__ import xrange as range
	from future_builtins import ascii, filter, hex, map, oct, zip

def ii():
	return int(input())

def fi():
	return float(input())

def si():
	return input()

def msi():
	return map(str, input().split())

def mi():
	return map(int, input().split())

def li():
	return list(mi())

def read():
	sys.stdin = open('input.txt', 'r')
	sys.stdout = open('output.txt', 'w')

def gcd(x, y):
	while y:
		(x, y) = (y, x % y)
	return x

def lcm(x, y):
	return x * y // gcd(x, y)
mod = 1000000007

def modInverse(b, m):
	g = gcd(b, m)
	if g != 1:
		return -1
	else:
		return pow(b, m - 2, m)

def ceil(x, y):
	if x % y == 0:
		return x // y
	else:
		return x // y + 1

def modu(a, b, m):
	a = a % m
	inv = modInverse(b, m)
	if inv == -1:
		return -999999999
	else:
		return inv * a % m
from math import log, sqrt, factorial, cos, tan, sin, radians, floor
import bisect
from decimal import *
getcontext().prec = 8
abc = 'abcdefghijklmnopqrstuvwxyz'
pi = 3.141592653589793

def fun(a, n):
	s = 0
	if n == 1:
		return s
	for i in range(n):
		b = []
		b.extend(a[0:i])
		c = a[i + 1:]
		b.extend(c)
		s += fun(b, n - 1)

def isP(n):
	c = 0
	for i in range(2, int(sqrt(n)) + 1):
		if n % i == 0:
			c += 1
	if c:
		return False
	return True
pr = []
for i in range(101, 1050):
	if isP(i):
		pr.append(i)

def main():
	n = ii()
	l = [1, 3, 40, 1260, 72576, 6652800, 889574400, 163459296000, 39520825344000, 12164510040883200]
	print(l[n // 2 - 1])
BUFSIZE = 8192

class FastIO(IOBase):
	newlines = 0

	def __init__(self, file):
		self._fd = file.fileno()
		self.buffer = BytesIO()
		self.writable = 'x' in file.mode or 'r' not in file.mode
		self.write = self.buffer.write if self.writable else None

	def read(self):
		while True:
			b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
			if not b:
				break
			ptr = self.buffer.tell()
			(self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
		self.newlines = 0
		return self.buffer.read()

	def readline(self):
		while self.newlines == 0:
			b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
			self.newlines = b.count(b'\n') + (not b)
			ptr = self.buffer.tell()
			(self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
		self.newlines -= 1
		return self.buffer.readline()

	def flush(self):
		if self.writable:
			os.write(self._fd, self.buffer.getvalue())
			(self.buffer.truncate(0), self.buffer.seek(0))

class IOWrapper(IOBase):

	def __init__(self, file):
		self.buffer = FastIO(file)
		self.flush = self.buffer.flush
		self.writable = self.buffer.writable
		self.write = lambda s: self.buffer.write(s.encode('ascii'))
		self.read = lambda : self.buffer.read().decode('ascii')
		self.readline = lambda : self.buffer.readline().decode('ascii')

def print(*args, **kwargs):
	(sep, file) = (kwargs.pop('sep', ' '), kwargs.pop('file', sys.stdout))
	at_start = True
	for x in args:
		if not at_start:
			file.write(sep)
		file.write(str(x))
		at_start = False
	file.write(kwargs.pop('end', '\n'))
	if kwargs.pop('flush', False):
		file.flush()
if sys.version_info[0] < 3:
	(sys.stdin, sys.stdout) = (FastIO(sys.stdin), FastIO(sys.stdout))
else:
	(sys.stdin, sys.stdout) = (IOWrapper(sys.stdin), IOWrapper(sys.stdout))
input = lambda : sys.stdin.readline().rstrip('\r\n')
main()


def fack(n):
	if n == 0:
		return 1
	return fack(n - 1) * n
kk = [0, 1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880]

def soch(n, k):
	return fack(n) // (fack(n - k) * fack(k))
n = int(input())
print(soch(n, n // 2) * kk[n // 2] ** 2 // 2)


ans = [1, 1]
for i in range(2, 21):
	ans.append(i * ans[-1])
r = int(input())
ncr = ans[r] // (ans[r // 2] * ans[r // 2])
ncr = ncr // 2
tp = ans[r // 2 - 1] * ans[r // 2 - 1]
print(ncr * tp)


import math
ans = [1, 1, 1, 3, 8, 40, 180, 1260, 8064, 72576, 604800, 6652800, 68428800, 889574400, 10897286400, 163459296000, 2324754432000, 39520825344000, 640237370572800, 12164510040883200, 221172909834240000, 4644631106519040000, 93666727314800640000]
n = int(input())
print(ans[n - 1])


from sys import stdin, stdout

def INPUT():
	return list((int(i) for i in stdin.readline().split()))
import math

def inp():
	return stdin.readline()

def out(x):
	return stdout.write(x)
import math as M
MOD = 10 ** 9 + 7
from random import randint as R
n = int(input())
(f, f2) = (1, 1)
for i in range(1, n + 1):
	f *= i
for i in range(1, n // 2 + 1):
	f2 *= i
x = 1
for i in range(1, n // 2):
	x *= i
print(f // (f2 * f2 * 2) * (x * x))


import math as mt
n = int(input())
l = n // 2
z = mt.factorial(n - 1) // l
print(z)


import math

def get_ways(n):
	b = n // 2
	return math.factorial(n) // (2 * b * b)
n = int(input())
print(get_ways(n))


n = int(input())
c = 1
for i in range(1, n + 1):
	c *= i
c //= n // 2
c //= n // 2
c //= 2
print(c)


import sys

def factorial(num):
	if num == 1:
		return 1
	return factorial(num - 1) * num
a = int(input())
print(int(factorial(a - 1) / (a // 2)))


from math import *
from bisect import *
from collections import *
from random import *
from decimal import *
from itertools import *
import sys
input = sys.stdin.readline

def inp():
	return int(input())

def st():
	return input().rstrip('\n')

def lis():
	return list(map(int, input().split()))

def ma():
	return map(int, input().split())
t = 1
while t:
	t -= 1
	n = inp()
	x = factorial(n)
	y = factorial(n // 2)
	r = x // (y * y)
	r = r // 2
	r1 = factorial(n // 2 - 1)
	print(r * r1 * r1)


from itertools import combinations
from math import factorial
n = int(input())
A = list(range(n))
print(len(list(combinations(A, n // 2))) // 2 * factorial(n // 2 - 1) ** 2)


from math import factorial

def comb(n, k):
	if n >= k:
		return factorial(n) // (factorial(k) * factorial(n - k))
	else:
		return 0
n = int(input())
ans = comb(n, n // 2) * factorial(n // 2 - 1) ** 2 // 2
print(ans)


import math

def nCk(n, k):
	return math.factorial(n) / (math.factorial(k) * math.factorial(n - k))

def circle_num(n):
	return math.factorial(n - 1)

def solve(n):
	choose = nCk(n, n // 2)
	circle = circle_num(n // 2)
	return int(choose * circle * circle // 2)
import sys
n = int(sys.stdin.readline())
print(solve(n))


class dance:

	def __init__(self, n):
		self.n = int(n)

	def fact(self):
		self.fac = 1
		for i in range(1, self.n):
			self.fac = self.fac * i
		return self.fac

	def result(self):
		print(int(self.fact() / (self.n / 2)))
tot = dance(input())
tot.result()


import sys
import math
import collections
import operator as op
from collections import deque
from math import gcd, inf, sqrt, pi, cos, sin, ceil, log2, floor
from bisect import bisect_right, bisect_left, bisect
from functools import reduce
from sys import stdin, stdout, setrecursionlimit
setrecursionlimit(2 ** 20)
T = 1
F = [1] * (20 + 1)
for i in range(1, 20 + 1):
	F[i] = F[i - 1] * i
for _ in range(T):
	n = int(stdin.readline())
	print(F[n] // (n * (n // 2)))


try:

	def fact(num):
		return 1 if num == 0 or num == 1 else num * fact(num - 1)
	n = int(input())
	ans = fact(n - 1) // (n // 2)
	print(ans)
except:
	pass


def nfac(n):
	if n == 0:
		return 1
	ans = 1
	for i in range(1, n + 1, 1):
		ans *= i
	return ans

def ncr(n, r):
	return nfac(n) / (nfac(n - r) * nfac(r))
n = int(input())
print(int(ncr(n, n // 2) * nfac(n // 2 - 1) ** 2 // 2))


from __future__ import division, print_function
from fractions import Fraction
import sys
import os
from io import BytesIO, IOBase
from heapq import *
from math import gcd, factorial, floor, ceil
from copy import deepcopy
from collections import deque
from bisect import bisect_left as bl
from bisect import bisect_right as br
from bisect import bisect
BUFSIZE = 8192

class FastIO(IOBase):
	newlines = 0

	def __init__(self, file):
		self._fd = file.fileno()
		self.buffer = BytesIO()
		self.writable = 'x' in file.mode or 'r' not in file.mode
		self.write = self.buffer.write if self.writable else None

	def read(self):
		while True:
			b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
			if not b:
				break
			ptr = self.buffer.tell()
			(self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
		self.newlines = 0
		return self.buffer.read()

	def readline(self):
		while self.newlines == 0:
			b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
			self.newlines = b.count(b'\n') + (not b)
			ptr = self.buffer.tell()
			(self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
		self.newlines -= 1
		return self.buffer.readline()

	def flush(self):
		if self.writable:
			os.write(self._fd, self.buffer.getvalue())
			(self.buffer.truncate(0), self.buffer.seek(0))

class IOWrapper(IOBase):

	def __init__(self, file):
		self.buffer = FastIO(file)
		self.flush = self.buffer.flush
		self.writable = self.buffer.writable
		self.write = lambda s: self.buffer.write(s.encode('ascii'))
		self.read = lambda : self.buffer.read().decode('ascii')
		self.readline = lambda : self.buffer.readline().decode('ascii')

def print(*args, **kwargs):
	(sep, file) = (kwargs.pop('sep', ' '), kwargs.pop('file', sys.stdout))
	at_start = True
	for x in args:
		if not at_start:
			file.write(sep)
		file.write(str(x))
		at_start = False
	file.write(kwargs.pop('end', '\n'))
	if kwargs.pop('flush', False):
		file.flush()
if sys.version_info[0] < 3:
	(sys.stdin, sys.stdout) = (FastIO(sys.stdin), FastIO(sys.stdout))
else:
	(sys.stdin, sys.stdout) = (IOWrapper(sys.stdin), IOWrapper(sys.stdout))
from types import GeneratorType

def iterative(f, stack=[]):

	def wrapped_func(*args, **kwargs):
		if stack:
			return f(*args, **kwargs)
		to = f(*args, **kwargs)
		while True:
			if type(to) is GeneratorType:
				stack.append(to)
				to = next(to)
				continue
			stack.pop()
			if not stack:
				break
			to = stack[-1].send(to)
		return to
	return wrapped_func
mod = 10 ** 9 + 7

def inp():
	return sys.stdin.readline().rstrip('\r\n')

def out(var):
	sys.stdout.write(str(var))

def lis():
	return list(map(int, inp().split()))

def stringlis():
	return list(map(str, inp().split()))

def sep():
	return map(int, inp().split())

def strsep():
	return map(str, inp().split())

def zerolist(n):
	return [0] * n

def nextline():
	out('\n')

def testcase(t):
	for pp in range(t):
		solve(pp)

def printlist(a):
	for p in range(0, len(a)):
		out(str(a[p]) + ' ')

def google(p):
	print('Case #' + str(p) + ': ', end='')

def lcm(a, b):
	return a * b // gcd(a, b)

def power(x, y, p):
	res = 1
	x = x % p
	if x == 0:
		return 0
	while y > 0:
		if y & 1 == 1:
			res = res * x % p
		y = y >> 1
		x = x * x % p
	return res

def ncr(n, r):
	return factorial(n) // (factorial(r) * factorial(max(n - r, 1)))

def isPrime(n):
	if n <= 1:
		return False
	if n <= 3:
		return True
	if n % 2 == 0 or n % 3 == 0:
		return False
	i = 5
	while i * i <= n:
		if n % i == 0 or n % (i + 2) == 0:
			return False
		i = i + 6
	return True
inf = pow(10, 20)

def bfs(g, st, ans, visited):
	visited[st] = 1
	queue = deque([])
	queue.append(st)
	new = []
	while len(queue) != 0:
		s = queue.popleft()
		new.append(s)
		for i in g[s]:
			if visited[i] == 0:
				visited[i] = 1
				queue.append(i)
				ans.append((s, i))
	return new

def solve(case):
	n = int(inp())
	print(ncr(n, n // 2) * factorial(n // 2 - 1) ** 2 // 2)
testcase(1)


n = int(input())
ans = 1
for i in range(3, n + 1):
	if i != n // 2:
		ans = ans * i
if n == 4:
	ans = ans // 4
else:
	ans = ans // (n // 2)
print(ans)


def f(n):
	if n == 1:
		return 1
	else:
		out = 1
		for i in range(1, n + 1):
			out *= i
		return out
n = int(input())
h = n // 2
print(f(n) // f(h) ** 2 // 2 * f(h - 1) ** 2)


import math

def choose(n, k):
	return math.factorial(n) // math.factorial(k) // math.factorial(n - k)

def f(n):
	x = choose(n, n // 2)
	x *= math.factorial(n // 2 - 1) ** 2
	x = x // 2
	return x
n = int(input())
print(f(n))


n = int(input())
ANS = 1
for i in range(n, n // 2, -1):
	ANS *= i
for i in range(n // 2, 0, -1):
	ANS //= i
for i in range(n // 2 - 1, 0, -1):
	ANS *= i * i
print(ANS // 2)


from sys import stdin, stdout

def f(n):
	k = 1
	for i in range(1, n + 1):
		k *= i
	return k
n = int(stdin.readline())
ans = 2 * f(n) // n ** 2
stdout.write(str(ans) + '\n')


n = int(input())
k = 1
for i in range(1, n):
	k = k * i
k = k * 2
k = k / n
print(int(k))


from math import factorial
n = int(input())
ans = factorial(n) // (factorial(n // 2) * factorial(n // 2))
mul = factorial(n // 2 - 1)
ans = mul * mul * ans
ans = ans // 2
print(ans)


from sys import stdin, stdout
from math import gcd, sqrt, factorial, pi, inf
from collections import deque, defaultdict
input = stdin.readline
R = lambda : map(int, input().split())
I = lambda : int(input())
S = lambda : input().rstrip('\n')
L = lambda : list(R())
P = lambda x: stdout.write(str(x) + '\n')
lcm = lambda x, y: x * y // gcd(x, y)
hg = lambda x, y: (y + x - 1) // x * x
pw = lambda x: 1 if x == 1 else 1 + pw(x // 2)
chk = lambda x: chk(x // 2) if not x % 2 else True if x == 1 else False
sm = lambda x: (x ** 2 + x) // 2
N = 10 ** 9 + 7
n = I()
if n == 2:
	print(1)
	exit()
m = [1] * (n // 2 + 1)
for i in range(n // 2 - 2):
	m = [sum(m[j:n // 2 + 1]) for j in range(n // 2 + 1)]
print(sum([sum([factorial(n // 2 - 1) ** 2 for j in range(i)]) for i in m]))


12164510040883200
import os
import sys
from io import BytesIO, IOBase
input = sys.stdin.readline

def inp():
	return int(input())

def inlt():
	return list(map(int, input().split()))

def insr():
	s = input()
	return list(s[:len(s) - 1])

def invr():
	return map(int, input().split())

def main():
	try:
		n = inp()
		from math import factorial
		print(factorial(n - 1) // (n // 2))
	except Exception as e:
		print(e)
BUFSIZE = 8192

class FastIO(IOBase):
	newlines = 0

	def __init__(self, file):
		self._fd = file.fileno()
		self.buffer = BytesIO()
		self.writable = 'x' in file.mode or 'r' not in file.mode
		self.write = self.buffer.write if self.writable else None

	def read(self):
		while True:
			b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
			if not b:
				break
			ptr = self.buffer.tell()
			(self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
		self.newlines = 0
		return self.buffer.read()

	def readline(self):
		while self.newlines == 0:
			b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
			self.newlines = b.count(b'\n') + (not b)
			ptr = self.buffer.tell()
			(self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
		self.newlines -= 1
		return self.buffer.readline()

	def flush(self):
		if self.writable:
			os.write(self._fd, self.buffer.getvalue())
			(self.buffer.truncate(0), self.buffer.seek(0))

class IOWrapper(IOBase):

	def __init__(self, file):
		self.buffer = FastIO(file)
		self.flush = self.buffer.flush
		self.writable = self.buffer.writable
		self.write = lambda s: self.buffer.write(s.encode('ascii'))
		self.read = lambda : self.buffer.read().decode('ascii')
		self.readline = lambda : self.buffer.readline().decode('ascii')
(sys.stdin, sys.stdout) = (IOWrapper(sys.stdin), IOWrapper(sys.stdout))
input = lambda : sys.stdin.readline().rstrip('\r\n')
main()


def jc(n):
	return 1 if n <= 1 else n * jc(n - 1)

def A(n, m):
	return jc(n) // jc(n - m)

def C(n, m):
	return A(n, m) // A(m, m)

def main():
	n = int(input())
	return C(n, n // 2) * jc(n // 2 - 1) ** 2 // 2
print(main())


import math

def P(a, b):
	permut = math.factorial(a) // math.factorial(a - b)
	return permut
students = int(input(''))
spt = students // 2
t1 = P(students, spt) // spt
t2 = math.factorial(spt) // spt
total = t1 * t2 // 2
print(total)


import math
n = int(input())
a = math.factorial(n // 2 - 1)
b = math.factorial(n) // (math.factorial(n // 2) * math.factorial(n // 2) * 2)
print(a * b * a)


from math import factorial
fact = [1] * 22
for i in range(1, 21):
	fact[i] = fact[i - 1] * i

def nCr(n, r):
	return fact[n] / (fact[n - r] * fact[r])
n = int(input())
ans = nCr(n, n >> 1) / 2 * fact[(n >> 1) - 1] * fact[(n >> 1) - 1]
print(int(ans))


def nCr(n, r):
	y = fact(n)
	z = fact(r) * fact(n - r)
	return int(y / z)

def fact(n):
	res = 1
	for i in range(2, n + 1):
		res = res * i
	return res
t = int(input())
h = int(t / 2)
f = nCr(t, h)
y = fact(h - 1)
f = int(f / 2)
f = f * y
f = f * y
print(f)


from math import factorial as _factorial
import sys as _sys

def main():
	(n,) = _read_ints()
	assert n % 2 == 0
	half_n = n // 2
	groups_variants_n = _factorial(n) // _factorial(half_n) ** 2 // 2
	permutation_variants_n = _factorial(half_n) // half_n if half_n > 2 else 1
	result = groups_variants_n * permutation_variants_n ** 2
	print(result)

def _read_line():
	result = _sys.stdin.readline()
	assert result[-1] == '\n'
	return result[:-1]

def _read_ints():
	return map(int, _read_line().split())
main()


import math
num = int(input())
comb = math.factorial(num) // math.factorial(num // 2) // math.factorial(num // 2)
res = comb * math.factorial(num // 2 - 1) ** 2
res = res // 2
print(res)


n = int(input())
f = 1
a = n - 1
while a > 1:
	f *= a
	a -= 1
m = n // 2
print(f // m)


a = int(input())
fact = 1
for i in range(1, a):
	fact *= i
print(int(fact / (a / 2)))


n = int(input())

def binomialCoeffUtil(n, k, dp):
	if dp[n][k] != -1:
		return dp[n][k]
	if k == 0:
		dp[n][k] = 1
		return dp[n][k]
	if k == n:
		dp[n][k] = 1
		return dp[n][k]
	dp[n][k] = binomialCoeffUtil(n - 1, k - 1, dp) + binomialCoeffUtil(n - 1, k, dp)
	return dp[n][k]

def binomialCoeff(n, k):
	dp = [[-1 for y in range(k + 1)] for x in range(n + 1)]
	return binomialCoeffUtil(n, k, dp)

def factorial(n):
	if n == 0:
		return 1
	return n * factorial(n - 1)
a = n
b = n // 2
ans = binomialCoeff(n, b) * pow(factorial(b - 1), 2) // 2
print(ans)


import math

def answer(N):
	dN = N / 2
	return int(math.factorial(N) / (2 * dN * dN))
n = int(input())
print(answer(n))


n = int(input())

def get_A(x):
	tmp = x
	res = 1
	while tmp > 1:
		res *= tmp
		tmp -= 1
	res //= x
	return res

def get_C(x):
	(p1, p2) = (1, 1)
	(a, b) = (x, x // 2)
	while b >= 1:
		p1 *= a
		p2 *= b
		a -= 1
		b -= 1
	res = p1 // p2
	return res
way = get_C(n)
way //= 2
temp = get_A(n // 2)
res = way * temp * temp
print(res)


import os
import sys
from math import factorial
from io import BytesIO, IOBase
BUFSIZE = 8192

class FastIO(IOBase):
	newlines = 0

	def __init__(self, file):
		self._fd = file.fileno()
		self.buffer = BytesIO()
		self.writable = 'x' in file.mode or 'r' not in file.mode
		self.write = self.buffer.write if self.writable else None

	def read(self):
		while True:
			b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
			if not b:
				break
			ptr = self.buffer.tell()
			(self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
		self.newlines = 0
		return self.buffer.read()

	def readline(self):
		while self.newlines == 0:
			b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
			self.newlines = b.count(b'\n') + (not b)
			ptr = self.buffer.tell()
			(self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
		self.newlines -= 1
		return self.buffer.readline()

	def flush(self):
		if self.writable:
			os.write(self._fd, self.buffer.getvalue())
			(self.buffer.truncate(0), self.buffer.seek(0))

class IOWrapper(IOBase):

	def __init__(self, file):
		self.buffer = FastIO(file)
		self.flush = self.buffer.flush
		self.writable = self.buffer.writable
		self.write = lambda s: self.buffer.write(s.encode('ascii'))
		self.read = lambda : self.buffer.read().decode('ascii')
		self.readline = lambda : self.buffer.readline().decode('ascii')
(sys.stdin, sys.stdout) = (IOWrapper(sys.stdin), IOWrapper(sys.stdout))
input = lambda : sys.stdin.readline().rstrip('\r\n')
readint = lambda : int(sys.stdin.readline().rstrip('\r\n'))
readints = lambda : map(int, sys.stdin.readline().rstrip('\r\n').split())
readstr = lambda : sys.stdin.readline().rstrip('\r\n')
readstrs = lambda : map(str, sys.stdin.readline().rstrip('\r\n').split())
readarri = lambda : [int(_) for _ in sys.stdin.readline().rstrip('\r\n').split()]
readarrs = lambda : [str(_) for _ in sys.stdin.readline().rstrip('\r\n').split()]

def main():
	n = readint()
	print(factorial(n - 1) // ((n + 1) // 2))
main()


import os
import sys
from io import BytesIO, IOBase
import heapq as h
from bisect import bisect_left, bisect_right
from types import GeneratorType
BUFSIZE = 8192

class FastIO(IOBase):
	newlines = 0

	def __init__(self, file):
		import os
		self.os = os
		self._fd = file.fileno()
		self.buffer = BytesIO()
		self.writable = 'x' in file.mode or 'r' not in file.mode
		self.write = self.buffer.write if self.writable else None

	def read(self):
		while True:
			b = self.os.read(self._fd, max(self.os.fstat(self._fd).st_size, BUFSIZE))
			if not b:
				break
			ptr = self.buffer.tell()
			(self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
		self.newlines = 0
		return self.buffer.read()

	def readline(self):
		while self.newlines == 0:
			b = self.os.read(self._fd, max(self.os.fstat(self._fd).st_size, BUFSIZE))
			self.newlines = b.count(b'\n') + (not b)
			ptr = self.buffer.tell()
			(self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
		self.newlines -= 1
		return self.buffer.readline()

	def flush(self):
		if self.writable:
			self.os.write(self._fd, self.buffer.getvalue())
			(self.buffer.truncate(0), self.buffer.seek(0))

class IOWrapper(IOBase):

	def __init__(self, file):
		self.buffer = FastIO(file)
		self.flush = self.buffer.flush
		self.writable = self.buffer.writable
		self.write = lambda s: self.buffer.write(s.encode('ascii'))
		self.read = lambda : self.buffer.read().decode('ascii')
		self.readline = lambda : self.buffer.readline().decode('ascii')
(sys.stdin, sys.stdout) = (IOWrapper(sys.stdin), IOWrapper(sys.stdout))
input = lambda : sys.stdin.readline().rstrip('\r\n')
import collections as col

def getInts():
	return [int(s) for s in input().split()]

def getInt():
	return int(input())

def getStrs():
	return [s for s in input().split()]

def getStr():
	return input()

def listStr():
	return list(input())
MOD = 10 ** 9 + 7
factorials = [1]
for j in range(1, 22):
	factorials.append(factorials[-1] * j)

def solve():
	N = getInt()
	ans = [0, 0, 1, 4, 3, 48, 40, 1440, 1260, 8960, 72576, 7257600, 6652800, 958003200, 889574400, 11623772160, 163459296000, 41845579776000, 39520825344000, 12804747411456000, 12164510040883200]
	return ans[N]
print(solve())


def fact(num):
	factorial = 1
	if num == 0:
		return 1
	else:
		for i in range(1, num + 1):
			factorial = factorial * i
		return factorial

def ncr(n, r):
	return fact(n) // (fact(r) * fact(n - r))
n = int(input())
k = n // 2
ans = ncr(n, n // 2) // 2 * fact(k) // k * fact(k) // k
print(ans)


import os, sys
from io import IOBase, BytesIO
py2 = round(0.5)
if py2:
	from future_builtins import ascii, filter, hex, map, oct, zip
	range = xrange
BUFSIZE = 8192

class FastIO(BytesIO):
	newlines = 0

	def __init__(self, file):
		self._file = file
		self._fd = file.fileno()
		self.writable = 'x' in file.mode or 'w' in file.mode
		self.write = super(FastIO, self).write if self.writable else None

	def _fill(self):
		s = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
		self.seek((self.tell(), self.seek(0, 2), super(FastIO, self).write(s))[0])
		return s

	def read(self):
		while self._fill():
			pass
		return super(FastIO, self).read()

	def readline(self):
		while self.newlines == 0:
			s = self._fill()
			self.newlines = s.count(b'\n') + (not s)
		self.newlines -= 1
		return super(FastIO, self).readline()

	def flush(self):
		if self.writable:
			os.write(self._fd, self.getvalue())
			(self.truncate(0), self.seek(0))

class IOWrapper(IOBase):

	def __init__(self, file):
		self.buffer = FastIO(file)
		self.flush = self.buffer.flush
		self.writable = self.buffer.writable
		if py2:
			self.write = self.buffer.write
			self.read = self.buffer.read
			self.readline = self.buffer.readline
		else:
			self.write = lambda s: self.buffer.write(s.encode('ascii'))
			self.read = lambda : self.buffer.read().decode('ascii')
			self.readline = lambda : self.buffer.readline().decode('ascii')
(sys.stdin, sys.stdout) = (IOWrapper(sys.stdin), IOWrapper(sys.stdout))
input = lambda : sys.stdin.readline().rstrip('\r\n')
import sys

class ostream:

	def __lshift__(self, a):
		sys.stdout.write(str(a))
		return self
cout = ostream()
endl = '\n'

def get_input(a=str):
	return a(input())

def get_int_input():
	return get_input(int)

def get_input_arr(a):
	return list(map(a, input().split()))

def get_int_input_arr():
	return get_input_arr(int)
import math
import operator as op
from functools import reduce

def solve():

	def ncr(n, r):
		r = min(r, n - r)
		numer = reduce(op.mul, range(n, n - r, -1), 1)
		denom = reduce(op.mul, range(1, r + 1), 1)
		return numer // denom
	hv = get_int_input()
	hf = hv // 2
	res = ncr(hv, hf) * math.factorial(hf - 1) * math.factorial(hf - 1) // 2
	cout << res << endl

def main():
	solve()
main()


import math

def c(a, b):
	return math.factorial(a) // math.factorial(b) // math.factorial(a - b)
n = int(input())
print(c(n, n // 2) // 2 * math.factorial(n // 2 - 1) ** 2)


def readInt():
	return int(input())
import math
t = readInt()
print(math.factorial(t) * 2 // t // t)


def memoize(f):
	mem = {}

	def h(x):
		if x not in mem:
			mem[x] = f(x)
		return mem[x]
	return h

@memoize
def fact(n):
	if n == 1 or n == 0:
		return 1
	else:
		return n * fact(n - 1)

def b(n):
	t = n // 2
	z = fact(t)
	return fact(n) // (z * z)

def one_round(n):
	return fact(n - 1)

def two_rounds(n):
	t = one_round(n // 2)
	return t * t * b(n) // 2
n = int(input().strip())
print(two_rounds(n))


from sys import stdin
from math import factorial
comb = lambda x, y: factorial(x) // (factorial(y) * factorial(x - y)) if x > y else 0
n = int(input())
ans = 1
for i in range(1, n - 1):
	ans *= i
ans2 = 1
remain = n - 2
if remain < n // 2:
	ans2 = 0
else:
	ans2 = comb(n - 2, n // 2 - 2) * factorial(n // 2 - 1) * factorial(n // 2 - 1)
print(ans + ans2)


def fatorial(n):
	fat = 1
	for num in range(2, n + 1):
		fat *= num
	return fat

def permutacao(n):
	perm = fatorial(n) / (n * n / 2)
	perm = int(perm)
	return perm
N = input()
N = int(N)
print(permutacao(N))


from sys import stdin
import math
import itertools
from functools import reduce
from decimal import Decimal

def nCr(n, r):
	return math.factorial(n) // (math.factorial(n - r) * math.factorial(r))
n = int(stdin.readline().rstrip())
print(math.factorial(n // 2 - 1) * math.factorial(n // 2 - 1) * (nCr(n, n // 2) // 2))


n = int(input())
s = 1
n1 = n
while n > 1:
	s = s * n
	n = n - 1
a = n1 * (n1 // 2)
print(s // a)


try:
	n = int(input())
	fact = 1
	for i in range(n - 1):
		fact = fact * (i + 1)
	temp = n // 2
	fact = fact // temp
	print(fact)
except:
	pass


n = int(input())

def fact(k):
	res = 1
	for i in range(2, int(k) + 1):
		res *= i
	return res
print(str(int(fact(n) / (n / 2) / (n / 2) / 2)))


import sys
import math
import itertools
import functools
import collections
import operator
import fileinput
import copy
import string
ORDA = 97

def ii():
	return int(input())

def mi():
	return map(int, input().split())

def li():
	return [int(i) for i in input().split()]

def lcm(a, b):
	return abs(a * b) // math.gcd(a, b)

def revn(n):
	return str(n)[::-1]

def dd():
	return collections.defaultdict(int)

def ddl():
	return collections.defaultdict(list)

def sieve(n):
	if n < 2:
		return list()
	prime = [True for _ in range(n + 1)]
	p = 3
	while p * p <= n:
		if prime[p]:
			for i in range(p * 2, n + 1, p):
				prime[i] = False
		p += 2
	r = [2]
	for p in range(3, n + 1, 2):
		if prime[p]:
			r.append(p)
	return r

def divs(n, start=2):
	r = []
	for i in range(start, int(math.sqrt(n) + 1)):
		if n % i == 0:
			if n / i == i:
				r.append(i)
			else:
				r.extend([i, n // i])
	return r

def divn(n, primes):
	divs_number = 1
	for i in primes:
		if n == 1:
			return divs_number
		t = 1
		while n % i == 0:
			t += 1
			n //= i
		divs_number *= t

def prime(n):
	if n == 2:
		return True
	if n % 2 == 0 or n <= 1:
		return False
	sqr = int(math.sqrt(n)) + 1
	for d in range(3, sqr, 2):
		if n % d == 0:
			return False
	return True

def convn(number, base):
	new_number = 0
	while number > 0:
		new_number += number % base
		number //= base
	return new_number

def cdiv(n, k):
	return n // k + (n % k != 0)

def ispal(s):
	for i in range(len(s) // 2 + 1):
		if s[i] != s[-i - 1]:
			return False
	return True
n = ii()
print(math.factorial(n - 1) // (n // 2))


def factorial(n):
	return 1 if n == 1 or n == 0 else n * factorial(n - 1)
num = int(input())
d = int(num / 2)
ans = factorial(num - 1)
print(int(ans / d))


def C(n, r):
	return fact(n) / (fact(r) * fact(n - r))

def fact(n):
	res = 1
	for i in range(2, n + 1):
		res = res * i
	return res
n = int(input())
ans = C(n, n // 2) * fact(n // 2 - 1) ** 2
print(int(ans // 2))


import math

def answer(n):
	c = math.comb(n, n // 2)
	p = math.perm(n // 2, n // 2)
	sq = p // (n // 2)
	ans = c * sq * sq
	return ans // 2

def main():
	n = int(input())
	print(answer(n))
	return
main()


def foo(a):
	res = 1
	for i in range(1, a + 1):
		res *= i
	return res

def bar(a):
	res = 1
	for i in range(a - 1, a - a // 2, -1):
		res *= i
	return res
a = int(input())
print(foo(a // 2 - 1) * bar(a))


from collections import defaultdict as dd
from math import factorial as fact

def C(n, r):
	if r > n:
		return 0
	return fact(n) // (fact(n - r) * fact(r))

def P(n):
	if n <= 0:
		return 1
	return fact(n)
n = int(input())
a = C(n, n // 2) // 2
b = P(n // 2 - 1)
print(a * b * b)


fact = lambda n: 1 if n == 0 else n * fact(n - 1)
C = lambda n, k: fact(n) // fact(k) // fact(n - k)
ans = lambda n: C(n, n // 2) * fact(n // 2 - 1) * fact(n // 2 - 1) // 2
print(ans(int(input())))


def fact(n):
	p = 1
	for i in range(1, n + 1):
		p = p * i
	return p

def ncr(n, r):
	a = fact(n)
	b = fact(r) * fact(n - r)
	return a // b
n = int(input())
a = ncr(n, n // 2)
b = fact(n // 2 - 1)
print(a * b * b // 2)


def fact(n):
	if n == 0:
		return 1
	else:
		return n * fact(n - 1)

def ncr(n, r):
	return int(fact(n) / (fact(n - r) * fact(r)))
n = int(input())
res = ncr(n, n // 2) // 2
temp = fact(n // 2 - 1) * fact(n // 2 - 1)
print(res * temp)


def fact(n):
	if n == 0 or n == 1:
		return 1
	else:
		return n * fact(n - 1)
n = int(input())
print(2 * fact(n - 1) // n)


import sys
from collections import defaultdict
from sys import maxsize

def ini():
	return int(sys.stdin.readline())

def inp():
	return map(int, sys.stdin.readline().strip().split())

def li():
	return list(map(int, sys.stdin.readline().strip().split()))

def f(n):
	return 1 if n == 1 or n == 0 else n * f(n - 1)
n = ini()
print(int(2 * f(n) / n ** 2))


import sys
from math import factorial
sys.setrecursionlimit(10 ** 5)
int1 = lambda x: int(x) - 1
p2D = lambda x: print(*x, sep='\n')

def II():
	return int(sys.stdin.buffer.readline())

def MI():
	return map(int, sys.stdin.buffer.readline().split())

def LI():
	return list(map(int, sys.stdin.buffer.readline().split()))

def LLI(rows_number):
	return [LI() for _ in range(rows_number)]

def BI():
	return sys.stdin.buffer.readline().rstrip()

def SI():
	return sys.stdin.buffer.readline().rstrip().decode()

def cir(n, r):
	if r == 1:
		return n
	if r == 2:
		return n * (n - 1) // 2
	return factorial(n) // factorial(n - r) // r
n = II()
n2 = n // 2
ans = cir(n, n2) * cir(n2, n2) // 2
print(ans)


def fac(v):
	p = 1
	for i in range(2, v + 1):
		p *= i
	return p

def single(n):
	if n < 3:
		return 1
	return fac(n - 1) // 2

def ncr(n, r):
	return fac(n) // fac(r) // fac(n - r)
n = int(input())
s = single(n // 2)
k = ncr(n, n // 2) // 2
if n > 4:
	k *= 4
print(s * s * k)


n = int(input())
temp = 1
for i in range(1, n):
	temp = temp * i
temp = temp // (n / 2)
print(int(temp))


def nCr(n, k):
	if n < k:
		return 0
	if k > n // 2:
		k = n - k
	ans = 1
	for i in range(1, k + 1):
		ans *= n - k + i
		ans //= i
	return ans

def orderings(n):
	r = 1
	for i in range(2, n):
		r *= i
	return r
n = int(input())
print(nCr(n, n // 2) // 2 * orderings(n // 2) ** 2)


import math
n = int(input())
number_of_groups = math.factorial(n) // math.factorial(n // 2) ** 2 // 2
counts_per_group = math.factorial(n // 2) // (n // 2)
print(number_of_groups * counts_per_group ** 2)


import math
n = int(input())
out = math.factorial(n) / (pow(n / 2, 2) * 2)
out = int(out)
print(out)


n = int(input())
ans = 1
i = n
while i > n / 2:
	ans *= i
	i -= 1
while i >= 2:
	ans /= i
	i -= 1
i = 1
n //= 2
while i <= n - 1:
	ans *= i * i
	i += 1
print(int(ans // 2))


from sys import stdin, stdout
from collections import defaultdict
input = stdin.readline
print = stdout.write
n = int(input())
ways = 1

def nCr(n, r):
	return fact(n) / (fact(r) * fact(n - r))

def fact(n):
	res = 1
	for i in range(2, n + 1):
		res = res * i
	return res
ways = ways * nCr(n, n // 2)
ways = ways // 2
ways = ways * fact(n // 2 - 1) * fact(n // 2 - 1)
ways = int(ways)
print(str(ways // 1) + '\n')


import itertools
n = int(input())
z = int(n / 2)
a = len(list(itertools.combinations(range(n), z)))
b = len(list(itertools.permutations(range(z - 1))))
a = int(a / 2)
print(a * b * b)


import math
n = int(input())
X = n // 2
m = math.factorial(n) // (math.factorial(X) * math.factorial(X))
s = m * math.factorial(X - 1)
s = s * math.factorial(X - 1)
print(s // 2)


n = int(input())
if n == 2:
	print(1)
elif n == 4:
	print(3)
elif n == 6:
	print(40)
elif n == 8:
	print(1260)
elif n == 10:
	print(72576)
elif n == 12:
	print(6652800)
elif n == 14:
	print(889574400)
elif n == 16:
	print(163459296000)
elif n == 18:
	print(39520825344000)
elif n == 20:
	print(12164510040883200)


from math import factorial
n = int(input())
a = factorial(n) / (factorial(n // 2) * factorial(n // 2))
a /= 2
ans = a * factorial(n // 2 - 1) * factorial(n // 2 - 1)
print(int(ans))


fct = [1]
for i in range(1, 21):
	fct.append(i * fct[-1])
n = int(input())
num = fct[n]
den = fct[n // 2]
terma = num / den
terma = terma / den
termb = fct[n // 2 - 1]
termb = termb * termb
print(int(terma * termb // 2))


n = input()
n = int(n)
acc = 1
for i in range(n):
	acc = acc * (i + 1)
acc = acc / n
acc = 2 * acc
acc = acc / n
print(int(acc))


import math
n = int(input())
a = math.factorial(n)
ans = 4 * a / (n * n)
print(int(ans / 2))


n = int(input())
if n == 2:
	print(1)
elif n == 4:
	print(3)
else:
	fact = [1]
	for s in range(1, n + 2):
		fact.append(fact[-1] * s)
	nc2 = fact[n] // (fact[n // 2] * fact[n // 2])
	perms = fact[n // 2 - 1] ** 2
	print(nc2 // 2 * perms)


import math
n = int(input())

def ncr(x, y):
	return math.factorial(x) // (math.factorial(y) * math.factorial(x - y))
ans = ncr(n, n // 2) * math.factorial(n // 2 - 1) ** 2 // 2
print(ans)


import sys
input = sys.stdin.readline
fact = [1] * 21
for i in range(2, 21):
	fact[i] = fact[i - 1] * i
for _ in range(1):
	n = int(input())
	ans = fact[n] // (fact[n // 2] * fact[n // 2])
	ans *= max(fact[n // 2 - 1] ** 2, 1)
	print(ans // 2)


def fac(k):
	if k == 1:
		return 1
	return fac(k - 1) * k

def f():
	n = int(input())
	print(2 * fac(n - 1) // n)
f()


num = input()
factorial_n = 1
for i in range(1, int(num) + 1):
	factorial_n = factorial_n * i
factorial_n2 = 1
for i in range(1, int(num) // 2 + 1):
	factorial_n2 = factorial_n2 * i
factorial_n = factorial_n // factorial_n2
factorial_n = factorial_n // factorial_n2
factorial_n = factorial_n // 2
f = 1
for i in range(1, int(num) // 2):
	f = f * i
factorial_n = factorial_n * f * f
print(factorial_n)


import math
n = int(input())
x = n // 2
y = math.factorial(n) // (math.factorial(n - x) * math.factorial(x))
sum = y * math.factorial(x - 1) * math.factorial(x - 1)
print(sum // 2)


import sys, os, io

def rs():
	return sys.stdin.readline().rstrip()

def ri():
	return int(sys.stdin.readline())

def ria():
	return list(map(int, sys.stdin.readline().split()))

def ws(s):
	sys.stdout.write(s + '\n')

def wi(n):
	sys.stdout.write(str(n) + '\n')

def wia(a):
	sys.stdout.write(' '.join([str(x) for x in a]) + '\n')
import math, datetime, functools, itertools, operator, bisect, fractions, statistics
from collections import deque, defaultdict, OrderedDict, Counter
from fractions import Fraction
from decimal import Decimal
from sys import stdout

def main():
	starttime = datetime.datetime.now()
	if os.path.exists('input.txt'):
		sys.stdin = open('input.txt', 'r')
		sys.stdout = open('output.txt', 'w')
	for _ in range(1):
		n = ri()
		k = 1
		print(math.factorial(n - 1) // (n // 2))
	endtime = datetime.datetime.now()
	time = (endtime - starttime).total_seconds() * 1000
	if os.path.exists('input.txt'):
		print('Time:', time, 'ms')

class FastReader(io.IOBase):
	newlines = 0

	def __init__(self, fd, chunk_size=1024 * 8):
		self._fd = fd
		self._chunk_size = chunk_size
		self.buffer = io.BytesIO()

	def read(self):
		while True:
			b = os.read(self._fd, max(os.fstat(self._fd).st_size, self._chunk_size))
			if not b:
				break
			ptr = self.buffer.tell()
			(self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
		self.newlines = 0
		return self.buffer.read()

	def readline(self, size=-1):
		while self.newlines == 0:
			b = os.read(self._fd, max(os.fstat(self._fd).st_size, self._chunk_size if size == -1 else size))
			self.newlines = b.count(b'\n') + (not b)
			ptr = self.buffer.tell()
			(self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
		self.newlines -= 1
		return self.buffer.readline()

class FastWriter(io.IOBase):

	def __init__(self, fd):
		self._fd = fd
		self.buffer = io.BytesIO()
		self.write = self.buffer.write

	def flush(self):
		os.write(self._fd, self.buffer.getvalue())
		(self.buffer.truncate(0), self.buffer.seek(0))

class FastStdin(io.IOBase):

	def __init__(self, fd=0):
		self.buffer = FastReader(fd)
		self.read = lambda : self.buffer.read().decode('ascii')
		self.readline = lambda : self.buffer.readline().decode('ascii')

class FastStdout(io.IOBase):

	def __init__(self, fd=1):
		self.buffer = FastWriter(fd)
		self.write = lambda s: self.buffer.write(s.encode('ascii'))
		self.flush = self.buffer.flush
sys.stdin = FastStdin()
sys.stdout = FastStdout()
main()


from pprint import pprint
import sys
n = int(input())
x = n // 2
res = 1
for i in range(1, n + 1):
	res *= i
res //= x
res //= x
res //= 2
print(res)


def factorial(m, n):
	if m == 0:
		return 1
	if m == 1:
		return n
	return factorial(m - 1, n * m)
n = int(input())
if n > 2:
	half = n // 2
	res = factorial(n, 1) // factorial(half, 1)
	res = res // factorial(half, 1)
	res = res // 2
	res = res * factorial(half - 1, 1) * factorial(half - 1, 1)
else:
	res = 1
print(res)


import sys
import math

def get_ints():
	return map(int, sys.stdin.readline().strip().split())

def get_list():
	return list(map(int, sys.stdin.readline().strip().split()))

def get_string():
	return sys.stdin.readline().strip()
for t in range(1):
	n = int(input())
	ans = math.factorial(n)
	ans = ans // (2 * (n // 2) ** 2)
	print(ans)


ans = 1
n = int(input())
b = n // 2
for i in range(1, n):
	ans *= i
ans = ans // b
print(ans)


from math import factorial

def f(n, x):
	return factorial(n) // (factorial(n - x) * factorial(x))
n = int(input())
print(f(n, n // 2) * factorial(n // 2 - 1) ** 2 // 2)


def fatorial(v):
	soma = 1
	for i in range(1, v + 1):
		soma = soma * i
	return soma
n = int(input())
res = fatorial(n - 1) // (n // 2)
print(res)


from collections import defaultdict
dic = {0: 1, 1: 1}
for i in range(2, 21):
	dic[i] = dic[i - 1] * i
for _ in range(1):
	n = int(input())
	out = dic[n] // dic[n // 2] ** 2
	out *= dic[n // 2 - 1] ** 2
	out = out // 2
	print(out)


def possiblity(k):
	f = 1
	for i in range(int(k / 2 + 1), k + 1):
		f *= i
	f /= k / 2
	g = 1
	for i in range(1, int(k / 2)):
		g *= i
	return f * g / 2

def answer():
	k = int(input())
	print(int(possiblity(k)))
answer()


from math import factorial
from itertools import chain, combinations, permutations

def subsets(iterable, low=0, high=None):
	s = list(iterable)
	if high is None:
		high = len(s)
	return chain.from_iterable((combinations(s, r) for r in range(low, high + 1)))

def normalize(p):
	ret = []
	for i in range(len(p)):
		if p[i] == 0:
			break
	for k in range(len(p)):
		ret += [p[(i + k) % len(p)]]
	return tuple(ret)

def cp(n):
	ret = set()
	for p in permutations(list(range(n))):
		ret.add(normalize(p))
	return len(ret)

def sub(a, b):
	ret = []
	for x in a:
		if x not in b:
			ret += [x]
	return tuple(ret)

def ans_fast(n):
	return factorial(n + 1) // (n // 2 + 1)

def ans(n):
	persons = list(range(n))
	ret = set()
	for s in subsets(persons, n // 2, n // 2):
		if 0 not in s:
			continue
		s1 = s
		s2 = sub(persons, s)
		for p1 in permutations(s1):
			for p2 in permutations(s2):
				ret.add((normalize(p1), normalize(p2)))
	return len(ret) // (n // 2)
n = int(input())
print(ans_fast(n - 2))


n = int(input())
m = n // 2
ans1 = 1
for i in range(m + 1, n + 1):
	ans1 *= i
ans2 = 1
for i in range(1, m + 1):
	ans2 *= i
ans1 //= m
ans2 //= m
print(ans1 * ans2 // 2)


import os
import sys
from io import BytesIO, IOBase
BUFSIZE = 8192

class FastIO(IOBase):
	newlines = 0

	def __init__(self, file):
		self._fd = file.fileno()
		self.buffer = BytesIO()
		self.writable = 'x' in file.mode or 'r' not in file.mode
		self.write = self.buffer.write if self.writable else None

	def read(self):
		while True:
			b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
			if not b:
				break
			ptr = self.buffer.tell()
			(self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
		self.newlines = 0
		return self.buffer.read()

	def readline(self):
		while self.newlines == 0:
			b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
			self.newlines = b.count(b'\n') + (not b)
			ptr = self.buffer.tell()
			(self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
		self.newlines -= 1
		return self.buffer.readline()

	def flush(self):
		if self.writable:
			os.write(self._fd, self.buffer.getvalue())
			(self.buffer.truncate(0), self.buffer.seek(0))

class IOWrapper(IOBase):

	def __init__(self, file):
		self.buffer = FastIO(file)
		self.flush = self.buffer.flush
		self.writable = self.buffer.writable
		self.write = lambda s: self.buffer.write(s.encode('ascii'))
		self.read = lambda : self.buffer.read().decode('ascii')
		self.readline = lambda : self.buffer.readline().decode('ascii')
(sys.stdin, sys.stdout) = (IOWrapper(sys.stdin), IOWrapper(sys.stdout))
input = lambda : sys.stdin.readline().rstrip('\r\n')
from math import gcd, ceil

def prod(a, mod=10 ** 9 + 7):
	ans = 1
	for each in a:
		ans = ans * each % mod
	return ans

def lcm(a, b):
	return a * b // gcd(a, b)

def binary(x, length=16):
	y = bin(x)[2:]
	return y if len(y) >= length else '0' * (length - len(y)) + y
from math import factorial
for _ in range(int(input()) if not True else 1):
	n = int(input())
	n = (n - 2) // 2
	print(factorial(2 * n + 1) // (n + 1))


from math import perm, comb
n = int(input())
m = n >> 1
print(comb(n, m) // 2 * (perm(m) // m) ** 2)


from collections import *
from functools import *
import math
import sys
inp = sys.stdin.readline
out = sys.stdout.write

def mi():
	return map(int, inp().split())

def li():
	return list(mi())

def ii():
	return int(inp())

def main():
	n = ii()
	print(int(math.factorial(n - 1) / math.floor((n + 1) / 2)))
main()


n = int(input())
n -= 2

def fact(a):
	s = 1
	for i in range(1, a + 1):
		s *= i
	return s
if n % 2 == 1:
	print(0)
else:
	print(int(fact(n + 1) / (int(n / 2) + 1)))


from os import path
import sys
from heapq import heappush, heappop
from functools import cmp_to_key as ctk
from collections import deque, defaultdict as dd
from bisect import bisect, bisect_left, bisect_right, insort, insort_left, insort_right
from itertools import permutations
from datetime import datetime
from math import ceil, sqrt, log, gcd

def ii():
	return int(input())

def si():
	return input().rstrip()

def mi():
	return map(int, input().split())

def li():
	return list(mi())
abc = 'abcdefghijklmnopqrstuvwxyz'
mod = 1000000007
inf = float('inf')
vow = ['a', 'e', 'i', 'o', 'u']
(dx, dy) = ([-1, 1, 0, 0], [0, 0, 1, -1])

def bo(i):
	return ord(i) - ord('a')
file = 1

def solve():
	fact = [1]
	for i in range(1, 21):
		fact.append(i * fact[-1])
	n = ii()
	print(fact[n - 1] // (n // 2))
if file:
	if path.exists('input.txt'):
		sys.stdin = open('input.txt', 'r')
		sys.stdout = open('output.txt', 'w')
	else:
		input = sys.stdin.readline
solve()


a = int(input())
n = 42
fact = [1]
for i in range(1, n):
	fact.append(i * fact[i - 1])
print(fact[a - 1] // ((a + 1) // 2))


from math import factorial as ft

def bin(a, b):
	return ft(a) // ft(a - b) // ft(b)
n = int(input())
print(bin(n, n // 2) * ft(n // 2 - 1) ** 2 // 2)


from functools import reduce
from operator import mul

def si():
	return str(input())

def ii():
	return int(input())

def mi():
	return map(int, input().split())

def li():
	return list(mi())
t = 1
for _ in range(t):
	n = ii()
	prod = reduce(mul, range(1, n + 1))
	print(prod // (n * n // 2))


from sys import maxsize, stdout, stdin
mod = int(1000000000.0 + 7)

def I():
	return int(stdin.readline())

def lint():
	return [int(x) for x in stdin.readline().split()]

def S():
	return input().strip()

def grid(r, c):
	return [lint() for i in range(r)]
from math import factorial
n = I()
print(factorial(n - 1) // (n // 2))


import sys
input = sys.stdin.readline
ret = [1, 1, 1, 1, 3, 8, 40, 180, 1260, 8064, 72576, 604800, 6652800, 68428800, 889574400, 10897286400, 163459296000, 2324754432000, 39520825344000, 640237370572800, 12164510040883200]
print(ret[int(input())])


a = int(input())
asd = 1
for i in range(2, a + 1):
	asd *= i
print(int((asd + asd) / a ** 2))


import math, sys, os
from io import BytesIO, IOBase
mod = 10 ** 9 + 7
BUFSIZE = 8192

class FastIO(IOBase):
	newlines = 0

	def __init__(self, file):
		self._fd = file.fileno()
		self.buffer = BytesIO()
		self.writable = 'x' in file.mode or 'r' not in file.mode
		self.write = self.buffer.write if self.writable else None

	def read(self):
		while True:
			b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
			if not b:
				break
			ptr = self.buffer.tell()
			(self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
		self.newlines = 0
		return self.buffer.read()

	def readline(self):
		while self.newlines == 0:
			b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
			self.newlines = b.count(b'\n') + (not b)
			ptr = self.buffer.tell()
			(self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
		self.newlines -= 1
		return self.buffer.readline()

	def flush(self):
		if self.writable:
			os.write(self._fd, self.buffer.getvalue())
			(self.buffer.truncate(0), self.buffer.seek(0))

class IOWrapper(IOBase):

	def __init__(self, file):
		self.buffer = FastIO(file)
		self.flush = self.buffer.flush
		self.writable = self.buffer.writable
		self.write = lambda s: self.buffer.write(s.encode('ascii'))
		self.read = lambda : self.buffer.read().decode('ascii')
		self.readline = lambda : self.buffer.readline().decode('ascii')
(sys.stdin, sys.stdout) = (IOWrapper(sys.stdin), IOWrapper(sys.stdout))
input = lambda : sys.stdin.readline().rstrip('\r\n')

def minp():
	return map(int, sys.stdin.readline().rstrip().split())

def linp():
	return list(map(int, sys.stdin.readline().rstrip().split()))

def inp():
	return int(input())

def print_list(l):
	print(' '.join(map(str, l)))
n = inp()
print(math.factorial(n) // ((n // 2) ** 2 * 2))


def factorial(num, stop=1):
	ans = 1
	while num != stop:
		ans *= num
		num -= 1
	return ans
n = int(input())
m = n // 2
t1 = int(factorial(n - 1, n // 2))
t2 = factorial(n) / (factorial(n - m) * m)
print(int(factorial(n) / (m * m * 2)))


import sys
input = sys.stdin.readline

def main():
	n = int(input())
	ans = 1
	for i in range(2, n):
		ans *= i
	print(ans // (n // 2))
main()


import sys, os.path
from collections import *
from heapq import *
from copy import *
import math
mod = 10 ** 9 + 7
if os.path.exists('input.txt'):
	sys.stdin = open('input.txt', 'r')
	sys.stdout = open('output.txt', 'w')
n = int(input())
ans = math.factorial(n - 1) // (n // 2)
print(ans)


n = int(input())
fact = [1]
for i in range(1, 21):
	fact.append(fact[i - 1] * i)
ans = 2 * (fact[n] // n // n)
if n <= 4:
	ans += 1
print(ans)


import math
n = int(input())
x = n // 2
x1 = 1
x2 = 1
x3 = 1
for i in range(1, x + 1):
	if i != x:
		x3 *= i
		x2 *= i
	else:
		x2 *= i
for i in range(x + 1, n + 1):
	x1 *= i
print(x3 * x3 * x1 // (2 * x2))


n = int(input())
x = y = 1
for i in range(n, 0, -1):
	x *= i
print(x // (n // 2) ** 2 // 2)


from math import factorial
from sys import stdin, gettrace
if gettrace():
	inputi = input
else:

	def input():
		return next(stdin)[:-1]

	def inputi():
		return stdin.buffer.readline()

def main():
	n = int(input())
	res = factorial(n) // (n // 2 * (n // 2) * 2)
	print(res)
main()


def factorial(a):
	fact = 1
	while a > 0:
		fact *= a
		a -= 1
	return fact

def combination(n):
	return factorial(n) / factorial(n / 2) ** 2
n = int(input())
c = combination(n)
n_1 = factorial(n / 2 - 1)
print(int(c * n_1 * n_1 / 2))


n = int(input())
answer = 1
answer1 = n - 1
while answer1 > 1:
	answer *= answer1
	answer1 = answer1 - 1
print(answer // (n // 2))


def f(n):
	if n == 0:
		return 1
	return n * f(n - 1)
n = int(input())
print(f(n) // (n * (n // 2)))


n = int(input())
if n == 2:
	print(1)
	exit(0)
fact = [1] * 21
for i in range(1, 21):
	fact[i] = fact[i - 1] * i
ans = fact[n] // fact[n // 2]
ans = ans // fact[n // 2]
ans = ans * fact[n // 2 - 1] * fact[n // 2 - 1]
print(ans // 2)


def fac(n):
	ans = 1
	for i in range(1, n + 1):
		ans *= i
	return ans

def comb(a, b):
	return fac(a) // fac(b) // fac(a - b)
n = int(input())
f = fac(n // 2 - 1)
print(comb(n, n // 2) * f * f // 2)


import math
n = int(input())
uniqueCombs = math.factorial(n) // math.pow(math.factorial(n // 2), 2)
waysOfSplitting = uniqueCombs // 2
print(int(waysOfSplitting * math.pow(math.factorial(n // 2 - 1), 2)))


def factorial(n):
	if n == 0:
		return 1
	if n == 1:
		return n
	return n * factorial(n - 1)

def solve(n):
	split_group = factorial(n) // factorial(n // 2) ** 2
	form_group = factorial(n // 2 - 1)
	res = split_group * form_group * form_group // 2
	return res

def main():
	n = int(input())
	print(solve(n))
main()


from math import factorial
n = int(input())
combination = factorial(n) // factorial(n // 2) ** 2
combination //= 2
x = factorial(n // 2 - 1)
x **= 2
print(combination * x)


def f(n):
	if n == 0:
		return 1
	else:
		return f(n - 1) * n

def C(n, m):
	return f(n) / (f(m) * f(n - m))
n = int(input())
m = int(C(n, n / 2) * f(n / 2 - 1) * f(n / 2 - 1) / 2)
print(m)


from math import *

def ncr(n, r):
	return factorial(n) // (factorial(r) * factorial(max(n - r, 1)))
n = int(input())
ans = ncr(n, n // 2) * factorial(n // 2 - 1) ** 2
ans //= 2
print(ans)


dp = [1 for i in range(21)]
for i in range(1, 21):
	dp[i] = i * dp[i - 1]
n = int(input())
ans = dp[n] // (dp[n // 2] * dp[n // 2])
ans = ans // 2
ans = ans * dp[n // 2 - 1] * dp[n // 2 - 1]
print(ans)


import sys
import os
import math
import copy
from math import gcd
from bisect import bisect
from io import BytesIO, IOBase
from math import factorial as f
from collections import deque, Counter, defaultdict
from itertools import permutations, combinations
from itertools import accumulate

def Int():
	return int(sys.stdin.readline())

def Mint():
	return map(int, sys.stdin.readline().split())

def Lstr():
	return list(sys.stdin.readline().strip())

def Str():
	return sys.stdin.readline().strip()

def Mstr():
	return map(str, sys.stdin.readline().strip().split())

def List():
	return list(map(int, sys.stdin.readline().split()))

def Hash():
	return dict()

def Mod():
	return 1000000007

def Ncr(n, r, p):
	return fact[n] * (ifact[r] * ifact[n - r] % p) % p

def Most_frequent(list):
	return max(set(list), key=list.count)

def Mat2x2(n):
	return [List() for _ in range(n)]

def Lcm(x, y):
	return x * y // gcd(x, y)

def dtob(n):
	return bin(n).replace('0b', '')

def btod(n):
	return int(n, 2)

def common(l1, l2):
	return set(l1).intersection(l2)

def solution():
	n = Int()
	print(2 * f(n) // (n * n))
solution()


from sys import stdin, stdout

def INI():
	return int(stdin.readline())

def INL():
	return [int(_) for _ in stdin.readline().split()]

def INS():
	return stdin.readline()

def OPS(ans):
	stdout.write(str(ans) + '\n')

def OPL(ans):
	[stdout.write(str(_) + ' ') for _ in ans]
	stdout.write('\n')
from math import factorial as fact
n = INI()
ans = fact(n) / fact(n // 2) ** 2 * fact(n // 2 - 1) * fact(n // 2 - 1)
OPS(int(ans // 2))


from bisect import bisect_left as bl
from bisect import bisect_right as br
from heapq import heappush, heappop
import math
from collections import *
from functools import reduce, cmp_to_key, lru_cache
import sys
input = sys.stdin.readline
M = mod = 998244353

def factors(n):
	return sorted(set(reduce(list.__add__, ([i, n // i] for i in range(1, int(n ** 0.5) + 1) if n % i == 0))))

def inv_mod(n):
	return pow(n, mod - 2, mod)

def li():
	return [int(i) for i in input().rstrip('\n').split()]

def st():
	return input().rstrip('\n')

def val():
	return int(input().rstrip('\n'))

def li2():
	return [i for i in input().rstrip('\n')]

def li3():
	return [int(i) for i in input().rstrip('\n')]

@lru_cache(None)
def fact(n):
	ans = 1
	if n == 0:
		return 1
	for i in range(1, n + 1):
		ans *= i
	return ans

def ncr(n, r):
	return fact(n) / (fact(r) * fact(n - r))
n = val()
print(int(ncr(n, n // 2) * fact(n // 2 - 1) ** 2 // 2))


import math
import sys
n = int(sys.stdin.readline().strip())
(out, s) = (1, 1)
out = math.factorial(n) // math.factorial(n // 2) ** 2
out *= math.factorial(n // 2 - 1) ** 2
out //= 2
print(out)


import sys
import math
from collections import Counter
try:
	for _ in range(1):
		n = int(input())
		x = math.factorial(n - 1)
		print(x // (n // 2))
except EOFError as e:
	print(e)


import math

def main():
	n = int(input())
	n1 = math.factorial(n)
	n2 = math.factorial(n // 2)
	print(n1 // (n // 2) // (n // 2) // 2)
main()


n = int(input())
mul = 1
for i in range(1, n + 1):
	mul *= i
print(mul // (n * (n // 2)))


from sys import stdin, stdout

def nCr(n, r):
	return fact(n) / (fact(r) * fact(n - r))

def fact(n):
	res = 1
	for i in range(2, n + 1):
		res = res * i
	return res
t = 1
for _ in range(t):
	n = int(input())
	val = int(nCr(n, n // 2) // 2)
	x = int(fact(n // 2) // (n / 2))
	print(val * x * x)


import math
import sys
if __name__ == 'CP':
	sys.stdin = open('ip.txt', 'r')
	sys.stdout = open('op.txt', 'w')
try:

	def main():
		t = 1
		while t:
			n = int(sys.stdin.readline())
			f = [1 for i in range(n + 1)]
			for i in range(2, n + 1):
				f[i] = f[i - 1] * i
			ans = f[n] // (f[n // 2] * f[n // 2])
			ans *= f[n // 2 - 1] * f[n // 2 - 1]
			ans //= 2
			sys.stdout.write(str(ans) + '\n')
			t -= 1
	main()
except Exception as e:
	sys.stdout.write('ErrOR : ' + str(e))


n = int(input())
fac = [1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800, 39916800, 479001600, 6227020800, 87178291200, 1307674368000, 20922789888000, 355687428096000, 6402373705728000, 121645100408832000, 2432902008176640000]
print(fac[n - 1] // (n // 2 * (n // 2) * 2))


import sys
INF = float('inf')
MOD = 10 ** 9 + 7
MOD2 = 998244353

def II():
	return int(sys.stdin.readline())

def LI():
	return list(map(int, sys.stdin.readline().split()))

def LC():
	return list(input())

def IC():
	return [int(c) for c in input()]

def MI():
	return map(int, sys.stdin.readline().split())
import math

def main():
	N = II()
	N = N // 2
	N -= 1
	print(math.factorial(2 * N + 1) // (N + 1))
main()


from itertools import combinations
n = int(input())
count = 0
list1 = []

def fact(numb):
	factorial = 1
	while numb != 0:
		factorial = factorial * numb
		numb -= 1
	return factorial
for i in range(1, n + 1):
	list1.append(i)
comblist = list(combinations(list1, n // 2))
ok = fact(n // 2 - 1) ** 2
print(len(comblist) * ok // 2)


def fact(n):
	result = 1
	for i in range(1, n + 1):
		result *= i
	return result
n = int(input())
k = n // 2
group = fact(n) // (fact(k) * fact(n - k)) // 2
print(group * fact(k - 1) ** 2)


x = int(input())
total = 1
for i in range(1, x):
	total = total * i
print(int(total * 2 / x))


n = int(input())
ans = 1
an = n - 1
while an > 1:
	ans *= an
	an = an - 1
print(ans // (n // 2))


def fact(n):
	if n == 1:
		return 1
	return n * fact(n - 1)

def dance(n):
	if n == 2:
		return 1
	f1 = fact(n)
	n = n // 2
	f2 = fact(n)
	f3 = f2 // n
	return f1 // (f2 * f2) * f3 * f3 // 2
n = int(input())
print(dance(n))


import sys
import os
from math import sqrt, log, log2, log10, gcd, floor, pow, sin, cos, tan, pi, inf, factorial
from copy import copy, deepcopy
from sys import exit, stdin, stdout
from collections import Counter, defaultdict, deque
from itertools import permutations
import heapq
from bisect import bisect_left as bl
from bisect import bisect_right as br
from bisect import bisect
mod = 1000000007
iinp = lambda : int(sys.stdin.readline())
inp = lambda : sys.stdin.readline().strip()
strl = lambda : list(inp().strip().split(' '))
intl = lambda : list(map(int, inp().split(' ')))
mint = lambda : map(int, inp().split())
flol = lambda : list(map(float, inp().split(' ')))
flush = lambda : stdout.flush()

def permute(nums):

	def fun(arr, nums, cur, v):
		if len(cur) == len(nums):
			arr.append(cur.copy())
		i = 0
		while i < len(nums):
			if v[i]:
				i += 1
				continue
			else:
				cur.append(nums[i])
				v[i] = 1
				fun(arr, nums, cur, v)
				cur.pop()
				v[i] = 0
				i += 1
		return arr
	res = []
	nums.sort()
	v = [0] * len(nums)
	return fun(res, nums, [], v)

def subsets(res, index, arr, cur):
	res.append(cur.copy())
	for i in range(index, len(arr)):
		cur.append(arr[i])
		subsets(res, i + 1, arr, cur)
		cur.pop()
	return res

def sieve(N):
	root = int(sqrt(N))
	primes = [1] * (N + 1)
	(primes[0], primes[1]) = (0, 0)
	for i in range(2, root + 1):
		if primes[i]:
			for j in range(i * i, N + 1, i):
				primes[j] = 0
	return primes

def bs(arr, l, r, x):
	if x < arr[0] or x > arr[len(arr) - 1]:
		return -1
	while l <= r:
		mid = l + (r - l) // 2
		if arr[mid] == x:
			return mid
		elif arr[mid] < x:
			l = mid + 1
		else:
			r = mid - 1
	return -1

def isPrime(n):
	if n <= 1:
		return False
	if n <= 3:
		return True
	if n % 2 == 0 or n % 3 == 0:
		return False
	p = int(sqrt(n))
	for i in range(5, p + 1, 6):
		if n % i == 0 or n % (i + 2) == 0:
			return False
	return True

def ncr(a, b):
	return factorial(a) // (factorial(b) * factorial(a - b))

def solve():
	n = iinp()
	ans = ncr(n, n // 2) * factorial(n // 2 - 1) ** 2
	return ans // 2
print(solve())


import io
import os
input = io.BytesIO(os.read(0, os.fstat(0).st_size)).readline
n = int(input())
from math import factorial
a = factorial(n)
b = factorial(n // 2)
c = a / b / b
d = b / n
e = c * 2 * d * d
print(int(e))


arr = [1, 1, 2, 6]
for i in range(4, 10):
	arr.append(arr[-1] * i)

def choose(n, r):
	if r == n or r == 0:
		return 1
	return choose(n - 1, r - 1) + choose(n - 1, r)
n = int(input())
a = choose(n, n // 2)
k = arr[n // 2 - 1]
print(a * k * k // 2)


import math
import sys
input = sys.stdin.readline
from collections import Counter, defaultdict, deque

def f(n):
	ans = fact[n] // ((n // 2) ** 2 * 2)
	return ans
t = 1
fact = [1 for i in range(21)]
for i in range(2, 21):
	fact[i] = fact[i - 1] * i
result = []
for i in range(t):
	n = int(input())
	result.append(f(n))
for i in range(t):
	print(result[i])


from math import factorial as f
n = int(input())
ans = f(n)
ans //= 2
n //= 2
for i in range(2, 21):
	while n % i == 0:
		ans //= i ** 2
		n //= i
print(ans)


import sys
from math import factorial
input = sys.stdin.readline

def comb(n, k):
	return factorial(n) // factorial(k) // factorial(n - k)

def main():
	n = int(input())
	m = n // 2
	print(comb(n, m) * factorial(m - 1) * factorial(m - 1) // 2)
main()


n = int(input())
p = 2
for i in range(1, n):
	p = p * i
print(p // n)


def solve():
	n = int(input())
	n -= 2
	num = 2
	for i in range(1, n + 2):
		num *= i
	num = num // (n + 2)
	return num
print(solve())


n = int(input())
if n == 2:
	print(1)
elif n == 4:
	print(3)
else:
	result = 1
	for i in range(1, n + 1):
		result *= i
	print(result // n * 2 // n)


from math import *
import sys
from sys import stdin
from sys import stdout
n = int(input())
if n % 2 == 1:
	print(0)
else:
	fact = [1]
	for i in range(1, 21):
		fact.append(fact[-1] * i)
	print(fact[n - 1] // (n // 2))


def fact(n):
	n = int(n)
	sum = 1
	for i in range(1, n + 1):
		sum = sum * i
	return sum
n = int(input())
x = fact(n) / fact(n / 2) / fact(n / 2)
x = x * fact(n / 2 - 1) * fact(n / 2 - 1)
x = x / 2
print(int(x))


def fact(n):
	x = 1
	for i in range(1, n + 1):
		x *= i
	return x

def ans(n):
	t = fact(n)
	z = n // 2
	a = z * z * 2
	print(t // a)
n = int(input())
ans(n)


n = int(input())
p = 1
for j in range(1, n):
	p *= j
kk = n // 2
print(p // kk)


import math

def binom(n, k):
	return math.factorial(n) // math.factorial(k) // math.factorial(n - k)
tt = int(input())
print(binom(tt, tt // 2) * math.factorial(tt // 2 - 1) * math.factorial(tt // 2 - 1) // 2)


import sys
import math
from collections import Counter
from collections import OrderedDict
from functools import reduce
sys.setrecursionlimit(10 ** 6)

def inputt():
	return sys.stdin.readline().strip()

def printt(n):
	sys.stdout.write(str(n) + '\n')

def listt():
	return [int(i) for i in inputt().split()]

def gcd(a, b):
	return math.gcd(a, b)

def lcm(a, b):
	return a * b // gcd(a, b)

def factors(n):
	return set(reduce(list.__add__, ([i, n // i] for i in range(1, int(n ** 0.5) + 1) if n % i == 0)))

def comb(n, k):
	factn = math.factorial(n)
	factk = math.factorial(k)
	fact = math.factorial(n - k)
	ans = factn // (factk * fact)
	return ans
t = 1
for _ in range(t):
	n = int(inputt())
	k = n // 2
	t = math.factorial(k - 1) ** 2
	a = comb(n, k) // 2
	print(a * t)


n = int(input())

def fact(n):
	if n == 0:
		return 1
	return n * fact(n - 1)

def choose(n, r):
	if r > n:
		return 0
	return fact(n) // (fact(n - r) * fact(r))
half = n // 2
ans = choose(n, half) // 2
ans = ans * fact(half - 1) * fact(half - 1)
print(ans)


import math

def ncr(n, p):
	n = n - 1
	a = math.factorial(n)
	return a // p
n = int(input())
print(ncr(n, n // 2))


from math import factorial
t = int(input())
print(2 * factorial(t) // t ** 2)


from math import factorial

def nCr(n, r):
	return factorial(n) // (factorial(r) * factorial(n - r))
x = int(input())
y = factorial(x // 2 - 1)
print(nCr(x, x // 2) * y * y // 2)


import math

def gcd(x, y):
	while y != 0:
		(x, y) = (y, x % y)
	return x

def lcm(x, y):
	return x * y // gcd(x, y)

def nCr(n, r):
	p = 1
	k = 1
	r = min(n, n - r)
	for r2 in range(r, 0, -1):
		p *= n
		k *= r2
		m = gcd(p, k)
		p //= m
		k //= m
		n -= 1
	return p
n = int(input())
a = nCr(n, n // 2)
b = math.factorial(n // 2) // (n // 2)
c = a * b * b // 2
print(c)


import math
n = int(input())
t = math.factorial(n) // math.factorial(n // 2) ** 2 // 2
print(t * math.factorial(n // 2 - 1) ** 2)


from collections import Counter
import string
import math
import sys
from fractions import Fraction

def array_int():
	return [int(i) for i in sys.stdin.readline().split()]

def vary(arrber_of_variables):
	if arrber_of_variables == 1:
		return int(sys.stdin.readline())
	if arrber_of_variables >= 2:
		return map(int, sys.stdin.readline().split())

def makedict(var):
	return dict(Counter(var))

def printDivisors(n):
	divisors = []
	i = 1
	while i <= math.sqrt(n):
		if n % i == 0:
			if n // i == i:
				divisors.append(i)
			else:
				divisors.extend((i, n // i))
		i = i + 1
	return divisors

def countTotalBits(num):
	binary = bin(num)[2:]
	return len(binary)

def isPrime(n):
	if n <= 1:
		return False
	if n <= 3:
		return True
	if n % 2 == 0 or n % 3 == 0:
		return False
	i = 5
	while i * i <= n:
		if n % i == 0 or n % (i + 2) == 0:
			return False
		i = i + 6
	return True
if 1:
	n = vary(1)
	fact = 1
	for i in range(2, n + 1):
		fact *= i
	z = (n // 2) ** 2 * 2
	print(fact // z)


import io
import os
n = int(input())
from math import factorial
a = factorial(n)
b = factorial(n // 2)
c = a / b / b
d = b / n
e = c * 2 * d * d
print(int(e))


def factorial(n):
	ans = 1
	while n > 1:
		ans *= n
		n -= 1
	return ans

def solve(n):
	combination = factorial(n) // (factorial(n - n // 2) * factorial(n // 2))
	return combination * (factorial(n // 2 - 1) * factorial(n // 2 - 1)) // 2
print(solve(int(input())))


from math import factorial

def bin_coef(n, k):
	dp = [[0 for _ in range(k + 1)] for _ in range(n + 1)]
	for i in range(n + 1):
		for j in range(k + 1):
			if i == j:
				dp[i][j] = 1
			else:
				dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j]
	return dp[n][k]
n = int(input())
subsets = bin_coef(n, n // 2)
print(factorial(n) // (n * (n // 2)))


def fac(a):
	f = 1
	if n >= 1:
		for i in range(1, a + 1):
			f *= i
	return f
n = int(input())
c = fac(n) // (n // 2 * n // 2 * 2)
print(c)


def comb(n, p):
	return fat[n] // (fat[p] * fat[n - p])
n = int(input())
gp = n // 2
x = 1
fat = [1] * (n + 2)
fat[2] = 2
for j in range(3, n + 1):
	fat[j] = fat[j - 1] * j
y = comb(n, gp) // 2
y *= fat[gp - 1] ** 2
print(y)


from math import *
import threading
import sys

def fact(x):
	if x == 0:
		return 1
	else:
		return x * fact(x - 1)

def lower_bound(li, num):
	answer = -1
	start = 0
	end = len(li) - 1
	while start <= end:
		middle = (end + start) // 2
		if li[middle] >= num:
			answer = middle
			end = middle - 1
		else:
			start = middle + 1
	return answer

def upper_bound(li, num):
	answer = -1
	start = 0
	end = len(li) - 1
	while start <= end:
		middle = (end + start) // 2
		if li[middle] <= num:
			answer = middle
			start = middle + 1
		else:
			end = middle - 1
	return answer

def abs(x):
	return x if x >= 0 else -x

def binary_search(li, val, lb, ub):
	ans = -1
	while lb <= ub:
		mid = (lb + ub) // 2
		if li[mid] > val:
			ub = mid - 1
		elif val > li[mid]:
			lb = mid + 1
		else:
			ans = mid
			break
	return ans

def kadane(x):
	sum_so_far = 0
	current_sum = 0
	for i in x:
		current_sum += i
		if current_sum < 0:
			current_sum = 0
		else:
			sum_so_far = max(sum_so_far, current_sum)
	return sum_so_far

def pref(li):
	pref_sum = [0]
	for i in li:
		pref_sum.append(pref_sum[-1] + i)
	return pref_sum

def graph(n, m):
	adj = dict()
	for i in range(1, n + 1):
		adj.setdefault(i, 0)
	for i in range(m):
		(a, b) = map(int, input().split())
		adj[a] += 1
		adj[b] += 1
	return adj

def SieveOfEratosthenes(n):
	prime = [True for i in range(n + 1)]
	p = 2
	li = []
	while p * p <= n:
		if prime[p] == True:
			for i in range(p * p, n + 1, p):
				prime[i] = False
		p += 1
	for p in range(2, len(prime)):
		if prime[p]:
			li.append(p)
	return li
INF = 1000000000.0
primes = SieveOfEratosthenes(1300000)

def fn(n):
	i = 2
	res = n - 1
	val = 0
	for i in range(int(sqrt(n)) + 1, 1, -1):
		val = i - 1 + int(ceil((n - i) / i))
		if val <= res:
			res = val
		else:
			break
	return res

def solve(a, b, c):
	dis = b ** 2 - 4 * a * c
	ans1 = (-b - sqrt(dis)) / (2 * a)
	print(int(ans1))
	return
for _ in range(1):
	n = int(input())
	print(fact(n - 1) // (n // 2))


n = int(input())
A = 1
for i in range(int(n / 2) + 1, n + 1):
	A *= i
A /= 2 * n / 2
for i in range(1, int(n / 2)):
	A *= i
print(int(A))


x = int(input())
fact = [1 for i in range(100)]
for i in range(1, 55):
	fact[i] = fact[i - 1] * i
ans = []
for i in range(50):
	ans.append(int(fact[2 * i + 1] / (i + 1)))
print(ans[x // 2 - 1])


import sys
import math

def solve(n):
	return math.factorial(n - 1) // (n // 2)

def main():
	n = int(sys.stdin.readline())
	print(solve(n))
main()


import math
n = int(input())
p = 1
d = {}
j = 1
for i in range(2, 22, 2):
	d[i] = j
	j += 1
for i in range(1, n):
	p *= i
print(p // d[n])


import math
n = int(input())
ans = math.factorial(n)
var = math.factorial(n // 2)
ans = ans // (var * var)
flag = math.factorial(n // 2 - 1)
ans = ans * flag * flag
print(ans // 2)


import math

def solution(a):
	result = math.factorial(a)
	return int(result / (a ** 2 / 2))
a = int(input())
result = solution(a)
print(result)


import sys
import math

def main():
	q = []
	for line in sys.stdin.readlines():
		q.append(line)
	for i in range(len(q)):
		q[i] = q[i].rstrip().split(' ')
		q[i] = [int(x) for x in q[i]]
	for i in range(len(q)):
		n = q[0][0]
		print(math.factorial(n - 1) // (n // 2))
main()


from math import factorial
N = int(input())

def juzu(n):
	if n <= 2:
		return 1
	return factorial(n - 1) // 2

def C(n, r):
	return factorial(n) // factorial(n - r) // factorial(r)
ans = juzu(N // 2) ** 2 * C(N, N // 2) * 2
if N <= 4:
	ans //= 4
print(ans)


import os
import sys
import math
from io import BytesIO, IOBase
from fractions import Fraction
import collections
from itertools import permutations
from collections import defaultdict
from collections import deque
import threading
BUFSIZE = 8192

class FastIO(IOBase):
	newlines = 0

	def __init__(self, file):
		self._fd = file.fileno()
		self.buffer = BytesIO()
		self.writable = 'x' in file.mode or 'r' not in file.mode
		self.write = self.buffer.write if self.writable else None

	def read(self):
		while True:
			b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
			if not b:
				break
			ptr = self.buffer.tell()
			(self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
		self.newlines = 0
		return self.buffer.read()

	def readline(self):
		while self.newlines == 0:
			b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
			self.newlines = b.count(b'\n') + (not b)
			ptr = self.buffer.tell()
			(self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
		self.newlines -= 1
		return self.buffer.readline()

	def flush(self):
		if self.writable:
			os.write(self._fd, self.buffer.getvalue())
			(self.buffer.truncate(0), self.buffer.seek(0))

class IOWrapper(IOBase):

	def __init__(self, file):
		self.buffer = FastIO(file)
		self.flush = self.buffer.flush
		self.writable = self.buffer.writable
		self.write = lambda s: self.buffer.write(s.encode('ascii'))
		self.read = lambda : self.buffer.read().decode('ascii')
		self.readline = lambda : self.buffer.readline().decode('ascii')
(sys.stdin, sys.stdout) = (IOWrapper(sys.stdin), IOWrapper(sys.stdout))
input = lambda : sys.stdin.readline().rstrip('\r\n')

class Factorial:

	def __init__(self, MOD):
		self.MOD = MOD
		self.factorials = [1, 1]
		self.invModulos = [0, 1]
		self.invFactorial_ = [1, 1]

	def calc(self, n):
		if n <= -1:
			print('Invalid argument to calculate n!')
			print('n must be non-negative value. But the argument was ' + str(n))
			exit()
		if n < len(self.factorials):
			return self.factorials[n]
		nextArr = [0] * (n + 1 - len(self.factorials))
		initialI = len(self.factorials)
		prev = self.factorials[-1]
		m = self.MOD
		for i in range(initialI, n + 1):
			prev = nextArr[i - initialI] = prev * i % m
		self.factorials += nextArr
		return self.factorials[n]

	def inv(self, n):
		if n <= -1:
			print('Invalid argument to calculate n^(-1)')
			print('n must be non-negative value. But the argument was ' + str(n))
			exit()
		p = self.MOD
		pi = n % p
		if pi < len(self.invModulos):
			return self.invModulos[pi]
		nextArr = [0] * (n + 1 - len(self.invModulos))
		initialI = len(self.invModulos)
		for i in range(initialI, min(p, n + 1)):
			next = -self.invModulos[p % i] * (p // i) % p
			self.invModulos.append(next)
		return self.invModulos[pi]

	def invFactorial(self, n):
		if n <= -1:
			print('Invalid argument to calculate (n^(-1))!')
			print('n must be non-negative value. But the argument was ' + str(n))
			exit()
		if n < len(self.invFactorial_):
			return self.invFactorial_[n]
		self.inv(n)
		nextArr = [0] * (n + 1 - len(self.invFactorial_))
		initialI = len(self.invFactorial_)
		prev = self.invFactorial_[-1]
		p = self.MOD
		for i in range(initialI, n + 1):
			prev = nextArr[i - initialI] = prev * self.invModulos[i % p] % p
		self.invFactorial_ += nextArr
		return self.invFactorial_[n]

class Combination:

	def __init__(self, MOD):
		self.MOD = MOD
		self.factorial = Factorial(MOD)

	def ncr(self, n, k):
		if k < 0 or n < k:
			return 0
		k = min(k, n - k)
		f = self.factorial
		return f.calc(n) * f.invFactorial(max(n - k, k)) * f.invFactorial(min(k, n - k)) % self.MOD
mod = 10 ** 9
for _ in range(1):
	n = int(input())
	f1 = math.factorial(n)
	f2 = math.factorial(n // 2)
	res = 2 * f1 // (n * n)
	print(res)


n = int(input())

def func(x):
	ans = 2
	for i in range(1, x):
		ans *= i
	ans //= x
	return ans
print(func(n))


from math import *
n = int(input())
out = 1
for i in range(1, n):
	out *= i
print(out // (n // 2))


import math
n = int(input())
v = math.factorial(n - 1) // (n // 2)
print(v)


from sys import stdin
input = lambda : stdin.readline().strip()
lin = lambda : list(map(int, input().split()))
iin = lambda : int(input())
main = lambda : map(int, input().split())
from math import ceil, sqrt, factorial, log
from collections import deque
from bisect import bisect_left

def gcd(a, b):
	(a, b) = (max(a, b), min(a, b))
	while a % b != 0:
		(a, b) = (b, a % b)
	return b
mod = 998244353

def solve(we):
	n = int(input())
	t = n // 2
	print(factorial(n) // (t * t * 2))
qwe = 1
for _ in range(qwe):
	solve(_ + 1)


import math
n = int(input())
print(int(math.factorial(n - 1) / math.floor((n + 1) / 2)))


import sys
input = sys.stdin.readline
(inp, ip) = (lambda : int(input()), lambda : [int(w) for w in input().split()])
n = inp()
from math import factorial as f
print(2 * f(n - 1) // n)


import sys, math, itertools
from collections import Counter, deque, defaultdict
from bisect import bisect_left, bisect_right
mod = 10 ** 9 + 7
INF = float('inf')

def inp():
	return int(sys.stdin.readline())

def inpl():
	return list(map(int, sys.stdin.readline().split()))
n = inp()
n //= 2
n -= 1
print(math.factorial(2 * n + 1) // (n + 1))


fat = [1]
for i in range(1, 25):
	fat.append(fat[-1] * i)
n = int(input())
n2 = n // 2
print(fat[n] // fat[n2] ** 2 * fat[n2 - 1] ** 2 // 2)


import math
n = int(input())
comb = 1
for i in range(n):
	if i != 0:
		comb = comb * i
comb = comb / (n / 2)
print(int(comb))


import math

def solution():
	N = int(input())
	return 2 * math.factorial(N) // (N * N)

def main():
	print(solution())
main()


def f(q):
	if q == 1:
		return 1
	return q * f(q - 1)

def c(q, m):
	return f(q) / (f(q - m) * f(m))
q = int(input())
sum = c(q, q / 2) / 2
sum = sum * f(q / 2) / (q / 2)
sum = sum * f(q / 2) / (q / 2)
print(int(sum))


n = int(input())
ans = 1
for i in range(n // 2):
	ans *= n - i
	ans //= i + 1
ans //= 2
a = n // 2 - 1
if a - 2 < 0:
	print(ans)
else:
	tmp = 1
	tmp = a * (a - 1)
	for i in range(a - 2):
		tmp *= i + 1
	print(ans * tmp ** 2)


n = int(input())
x = 1
for i in range(1, n + 1):
	x *= i
x /= n * n / 4
x /= 2
print(int(x))


from functools import reduce
print(int(reduce(lambda x, y: reduce(lambda a, b: a * b, y, 1) // (x * x / 2), max([(x + 1, [y + 1 for y in range(x + 1)]) for x in range(int(input()))]))))


from math import gcd
from bisect import bisect_left, bisect_right
from itertools import combinations
from itertools import permutations
from bisect import bisect_left
from math import ceil
from math import radians
from heapq import heapify, heappush, heappop, nsmallest
import bisect
from math import pi
from collections import deque
from math import factorial
from math import log, ceil
from collections import defaultdict
from math import *
from sys import stdin, stdout
import itertools
import os
import sys
import threading
from collections import deque, Counter, OrderedDict, defaultdict
from heapq import *
from fractions import Fraction
mod = int(pow(10, 9) + 7)

def ii():
	return int(input())

def si():
	return str(input())

def mi():
	return map(int, input().split())

def li1():
	return list(mi())

def fii():
	return int(stdin.readline())

def fsi():
	return str(stdin.readline())

def fmi():
	return map(int, stdin.readline().split())

def fli():
	return list(fmi())
abd = {'a': 0, 'b': 1, 'c': 2, 'd': 3, 'e': 4, 'f': 5, 'g': 6, 'h': 7, 'i': 8, 'j': 9, 'k': 10, 'l': 11, 'm': 12, 'n': 13, 'o': 14, 'p': 15, 'q': 16, 'r': 17, 's': 18, 't': 19, 'u': 20, 'v': 21, 'w': 22, 'x': 23, 'y': 24, 'z': 25}

def getKey(item):
	return item[0]

def sort2(l):
	return sorted(l, key=getKey)

def d2(n, m, num):
	return [[num for x in range(m)] for y in range(n)]

def isPowerOfTwo(x):
	return x and (not x & x - 1)

def decimalToBinary(n):
	return bin(n).replace('0b', '')

def ntl(n):
	return [int(i) for i in str(n)]

def powerMod(x, y, p):
	res = 1
	x %= p
	while y > 0:
		if y & 1:
			res = res * x % p
		y = y >> 1
		x = x * x % p
	return res
graph = defaultdict(list)
visited = [0] * 1000000
col = [-1] * 1000000

def bfs(d, v):
	q = []
	q.append(v)
	visited[v] = 1
	while len(q) != 0:
		x = q[0]
		q.pop(0)
		for i in d[x]:
			if visited[i] != 1:
				visited[i] = 1
				q.append(i)
		print(x)

def make_graph(e):
	d = {}
	for i in range(e):
		(x, y) = mi()
		if x not in d:
			d[x] = [y]
		else:
			d[x].append(y)
		if y not in d:
			d[y] = [x]
		else:
			d[y].append(x)
	return d

def gr2(n):
	d = defaultdict(list)
	for i in range(n):
		(x, y) = mi()
		d[x].append(y)
	return d

def connected_components(graph):
	seen = set()

	def dfs(v):
		vs = set([v])
		component = []
		while vs:
			v = vs.pop()
			seen.add(v)
			vs |= set(graph[v]) - seen
			component.append(v)
		return component
	ans = []
	for v in graph:
		if v not in seen:
			d = dfs(v)
			ans.append(d)
	return ans

def primeFactors(n):
	s = set()
	while n % 2 == 0:
		s.add(2)
		n = n // 2
	for i in range(3, int(sqrt(n)) + 1, 2):
		while n % i == 0 and i % 2 == 1:
			s.add(i)
			n = n // i
	if n > 2 and n % 2 == 1:
		s.add(n)
	return s

def find_all(a_str, sub):
	start = 0
	while True:
		start = a_str.find(sub, start)
		if start == -1:
			return
		yield start
		start += len(sub)

def SieveOfEratosthenes(n, isPrime):
	isPrime[0] = isPrime[1] = False
	for i in range(2, n):
		isPrime[i] = True
	p = 2
	while p * p <= n:
		if isPrime[p] == True:
			i = p * p
			while i <= n:
				isPrime[i] = False
				i += p
		p += 1
	return isPrime

def dijkstra(edges, f, t):
	g = defaultdict(list)
	for (l, r, c) in edges:
		g[l].append((c, r))
	(q, seen, mins) = ([(0, f, ())], set(), {f: 0})
	while q:
		(cost, v1, path) = heappop(q)
		if v1 not in seen:
			seen.add(v1)
			path = (v1, path)
			if v1 == t:
				return (cost, path)
			for (c, v2) in g.get(v1, ()):
				if v2 in seen:
					continue
				prev = mins.get(v2, None)
				next = cost + c
				if prev is None or next < prev:
					mins[v2] = next
					heappush(q, (next, v2, path))
	return float('inf')

def binsearch(a, l, r, x):
	while l <= r:
		mid = l + (r - 1) // 2
		if a[mid]:
			return mid
		elif a[mid] > x:
			l = mid - 1
		else:
			r = mid + 1
	return -1

def readTree(n):
	adj = [set() for _ in range(n)]
	for _ in range(n - 1):
		(u, v) = map(int, input().split())
		adj[u - 1].add(v - 1)
		adj[v - 1].add(u - 1)
	return adj

def treeOrderByDepth(n, adj, root=0):
	parent = [-2] + [-1] * (n - 1)
	ordered = []
	q = deque()
	q.append(root)
	depth = [0] * n
	while q:
		c = q.popleft()
		ordered.append(c)
		for a in adj[c]:
			if parent[a] == -1:
				parent[a] = c
				depth[a] = depth[c] + 1
				q.append(a)
	return (ordered, parent, depth)

def isSubSequence(str1, str2):
	m = len(str1)
	n = len(str2)
	j = 0
	i = 0
	while j < m and i < n:
		if str1[j] == str2[i]:
			j = j + 1
		i = i + 1
	return j == m

def nextPowerOf2(n):
	count = 0
	if n and (not n & n - 1):
		return n
	while n != 0:
		n >>= 1
		count += 1
	return 1 << count

def cou(n):
	c = 0
	while n > 1:
		c += 1
		n //= 2
	return c

def sortsec(l):
	return sorted(l, key=lambda x: x[1])

def BinarySearch(a, x):
	i = bisect_left(a, x)
	if i:
		return i - 1
	else:
		return -1

def subarray(A):
	r = set()
	p = {0}
	for x in A:
		p = {x | y for y in p} | {x}
		r |= p
	return len(r)

def setBitNumber(n):
	n |= n >> 1
	n |= n >> 2
	n |= n >> 4
	n |= n >> 8
	n |= n >> 16
	n = n + 1
	return n >> 1

def countSetBits(n):
	count = 0
	while n:
		count += n & 1
		n >>= 1
	return count

def allsub(l):
	n = len(l)
	a = []
	for i in range(n - 1):
		for j in range(i + 1, n):
			a.append(l[i:j])
	return a
n = ii()
print(int(factorial(n) / (n * (n // 2))))


import sys
input = sys.stdin.buffer.readline

def f(n):
	p = 1
	for i in range(1, n + 1):
		p *= i
	return p
n = int(input())
ans = f(n) // (f(n - n // 2) * f(n // 2))
ans *= f(n // 2 - 1) * f(n // 2 - 1)
print(ans // 2)


def fact(n):
	if n in [0, 1]:
		return 1
	f = 2
	for i in range(3, n + 1):
		f *= i
	return f
n = int(input())
_ = n // 2
print(fact(n) // fact(_) ** 2 // 2 * fact(_ - 1) ** 2)


import sys, os
from math import sqrt, gcd, ceil, log, floor
from bisect import bisect, bisect_left
from collections import defaultdict, Counter, deque
from heapq import heapify, heappush, heappop
input = sys.stdin.readline
read = lambda : list(map(int, input().strip().split()))
MOD = 10 ** 9 + 7

def nCr(n, r):
	return fact(n) // (fact(r) * fact(n - r))

def fact(n):
	res = 1
	for i in range(2, n + 1):
		res = res * i
	return res

def main():
	n = int(input())
	ans = nCr(n, n // 2) // 2 * fact(n // 2 - 1) ** 2
	print(ans)
main()


n = int(input())
nf = 1
n2f = 1
n1f = 1
for i in range(1, n + 1):
	nf = nf * i
for i in range(1, n // 2 + 1):
	n2f = n2f * i
for i in range(1, n // 2):
	n1f = n1f * i
ans = nf / n2f ** 2
ans = ans * n1f * n1f
ans = ans // 2
print(int(ans))


import math

def fact(q):
	product = 1
	for i in range(2, q + 1):
		product *= i
	return product

def ncr(n):
	q = fact(n)
	qq = fact(n // 2)
	return int(q // pow(qq, 2) / 2)
n = int(input())
q = n // 2
print(ncr(n) * fact(q - 1) * fact(q - 1))


def factorial(n):
	k = 1
	for i in range(2, n + 1):
		k *= i
	return k
n = int(input())
print(factorial(n) // factorial(n // 2) // factorial(n // 2) // 2 * factorial(n // 2 - 1) * factorial(n // 2 - 1))


from math import *

def printNcR(n, r):
	p = 1
	k = 1
	if n - r < r:
		r = n - r
	if r != 0:
		while r:
			p *= n
			k *= r
			m = gcd(p, k)
			p //= m
			k //= m
			n -= 1
			r -= 1
	else:
		p = 1
	return p
n = int(input())
print(printNcR(n, n // 2) * factorial(n // 2 - 1) ** 2 // 2)


import os
from io import BytesIO, IOBase
import sys
from collections import defaultdict, deque, Counter
from bisect import *
from math import sqrt, pi, ceil
import math
from itertools import permutations
from copy import deepcopy
from sys import setrecursionlimit

def main():
	from math import factorial
	n = int(input())
	print(factorial(n - 1) * 2 // n)
BUFSIZE = 8192

class FastIO(IOBase):
	newlines = 0

	def __init__(self, file):
		self._fd = file.fileno()
		self.buffer = BytesIO()
		self.writable = 'x' in file.mode or 'r' not in file.mode
		self.write = self.buffer.write if self.writable else None

	def read(self):
		while True:
			b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
			if not b:
				break
			ptr = self.buffer.tell()
			(self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
		self.newlines = 0
		return self.buffer.read()

	def readline(self):
		while self.newlines == 0:
			b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
			self.newlines = b.count(b'\n') + (not b)
			ptr = self.buffer.tell()
			(self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
		self.newlines -= 1
		return self.buffer.readline()

	def flush(self):
		if self.writable:
			os.write(self._fd, self.buffer.getvalue())
			(self.buffer.truncate(0), self.buffer.seek(0))

class IOWrapper(IOBase):

	def __init__(self, file):
		self.buffer = FastIO(file)
		self.flush = self.buffer.flush
		self.writable = self.buffer.writable
		self.write = lambda s: self.buffer.write(s.encode('ascii'))
		self.read = lambda : self.buffer.read().decode('ascii')
		self.readline = lambda : self.buffer.readline().decode('ascii')
(sys.stdin, sys.stdout) = (IOWrapper(sys.stdin), IOWrapper(sys.stdout))
input = lambda : sys.stdin.readline().rstrip('\r\n')
main()


import sys, math
input = sys.stdin.readline

def findncr(n, r):
	res = 1
	for i in range(1, r + 1):
		res = res * (n - r + i) / i
	return int(res)
n = int(input())
if n == 2:
	sys.stdout.write(str(1) + '\n')
else:
	ans = findncr(n, n // 2) // 2 * math.factorial(n // 2 - 1) * math.factorial(n // 2 - 1)
	sys.stdout.write(str(ans) + '\n')


import math
from math import factorial
t = 1
for i in range(t):
	n = int(input())
	n = n - 2
	n = n // 2
	print(factorial(2 * n + 1) // (n + 1))


from math import factorial

def C_N_K(n, k):
	return factorial(n) // (factorial(k) * factorial(n - k))
x = int(input())
print(C_N_K(x, x // 2) // 2 * factorial((x - 1) // 2) ** 2)


from math import *
n = int(input())
c = 0
for i in range(2 ** n):
	if bin(i).count('1') == n // 2:
		c += 1
print(c // 2 * factorial(n // 2 - 1) ** 2)


import math
from sys import stdin

def nCr(n, r):
	return math.factorial(n) // (math.factorial(n - r) * math.factorial(r))
tt = 1
for loop in range(tt):
	n = int(stdin.readline())
	if n == 2:
		print(1)
	elif n == 4:
		print(3)
	else:
		print(nCr(n - 1, n // 2) * math.factorial(n // 2 - 1) ** 2)


n = int(input())
fact = []
p = 1
fact.append(p)
for i in range(1, 21):
	p *= i
	fact.append(p)
p1 = fact[n] / fact[n // 2] ** 2
p1 /= 2
p1 *= fact[n // 2 - 1] ** 2
print(int(p1))


import sys, math
dp = [0] * 21
dp[2] = 1
dp[4] = 3
dp[6] = math.factorial(6) // 18
dp[8] = math.factorial(8) // 32
dp[10] = math.factorial(10) // 50
dp[12] = math.factorial(12) // 72
dp[14] = math.factorial(14) // 98
dp[16] = math.factorial(16) // 128
dp[18] = math.factorial(18) // 162
dp[20] = math.factorial(20) // 200
print(dp[int(sys.stdin.readline())])


import sys
inp = sys.stdin.buffer.readline
inar = lambda : list(map(int, inp().split()))
inin = lambda : int(inp())
inst = lambda : inp().decode().strip()
wrt = sys.stdout.write
pr = lambda *args, end='\n': wrt(' '.join([str(x) for x in args]) + end)
enum = enumerate
inf = float('inf')
cdiv = lambda x, y: -(-x // y)
mod = 1000000007
from math import factorial as f

def C(n, r):
	if r > n:
		return 0
	return f(n) // (f(n - r) * f(r))
_T_ = 1
for _t_ in range(_T_):
	n = inin()
	r = n // 2
	print(C(n, r) * f(r - 1) * f(r - 1) // 2)


n = int(input())
ans = 1
for i in range(n):
	ans *= i + 1
for i in range(n // 2):
	ans //= i + 1
	ans //= i + 1
gg = 1
for i in range(n // 2 - 1):
	gg *= i + 1
ans *= gg * gg
ans //= 2
print(ans)


n = int(input())
i = n
num = 1
den = 1
while i > n // 2:
	num *= i
	den *= n - i + 1
	i -= 1
c = num // den
arr = [1, 1, 2]
for i in range(8, n + 1, 2):
	arr.append((i // 2 - 1) * arr[-1])
x = arr[n // 2 - 1]
print(c // 2 * x ** 2)


n = int(input())
factorials = [0, 1]
for ind in range(2, n + 1):
	prev = factorials[-1]
	factorials.append(prev * ind)
n2 = n // 2
k = factorials[n2]
t = factorials[n]
f = n2 - 1
C = t // k // k // 2
print(C * (k // n2) * (k // n2))


from math import factorial
n = int(input())
res = factorial(n) * 2 // n ** 2
print(res)


n = int(input())
c = 1
for i in range(1, n + 1):
	c *= i
q = 1
for i in range(1, n // 2 + 1):
	if i < n // 2:
		q *= i
	c //= i * i
c //= 2
print(c * q * q)


n = int(input())
cum = 1
cum2 = 1
cum3 = 1
for i in range(1, n + 1):
	cum = cum * i
	if i <= int(n / 2):
		cum2 = cum2 * i
	if i <= int(n / 2) - 1:
		cum3 = cum3 * i
denom = cum2 * cum2 * 2
num = cum * cum3 * cum3
res = int(num / denom)
print(res)


n = int(input())
fact = [0, 1]
for i in range(2, n + 1):
	fact.append(fact[-1] * i)
print(fact[n] // (n // 2) // (n // 2) // 2)


import os
import sys
from io import BytesIO, IOBase
BUFSIZE = 8192

class FastIO(IOBase):
	newlines = 0

	def __init__(self, file):
		self._fd = file.fileno()
		self.buffer = BytesIO()
		self.writable = 'x' in file.mode or 'r' not in file.mode
		self.write = self.buffer.write if self.writable else None

	def read(self):
		while True:
			b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
			if not b:
				break
			ptr = self.buffer.tell()
			(self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
		self.newlines = 0
		return self.buffer.read()

	def readline(self):
		while self.newlines == 0:
			b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
			self.newlines = b.count(b'\n') + (not b)
			ptr = self.buffer.tell()
			(self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
		self.newlines -= 1
		return self.buffer.readline()

	def flush(self):
		if self.writable:
			os.write(self._fd, self.buffer.getvalue())
			(self.buffer.truncate(0), self.buffer.seek(0))

class IOWrapper(IOBase):

	def __init__(self, file):
		self.buffer = FastIO(file)
		self.flush = self.buffer.flush
		self.writable = self.buffer.writable
		self.write = lambda s: self.buffer.write(s.encode('ascii'))
		self.read = lambda : self.buffer.read().decode('ascii')
		self.readline = lambda : self.buffer.readline().decode('ascii')
(sys.stdin, sys.stdout) = (IOWrapper(sys.stdin), IOWrapper(sys.stdout))

def input():
	return sys.stdin.readline().rstrip('\r\n')
n = int(input())
m = {2: 1, 4: 3, 6: 20}

def A(a):
	ass = 1
	for i in range(1, a + 1):
		ass *= i
	return ass

def comb(n, b):
	res = 1
	b = min(b, n - b)
	for i in range(b):
		res = res * (n - i) // (i + 1)
	return res
print(comb(n, n >> 1) * A(n // 2 - 1) ** 2 // 2)


from math import sqrt
from sys import stdin, stdout
shan = [1, 3, 40, 1260, 72576, 6652800, 889574400, 163459296000, 39520825344000, 12164510040883200]
n = int(stdin.readline())
print(shan[n // 2 - 1])


import sys
sys.setrecursionlimit(311111)
ikimasu = sys.stdin.buffer.readline
ini = lambda : int(ins())
ina = lambda : list(map(int, ikimasu().split()))
ins = lambda : ikimasu().strip()
from math import factorial
codeforces = 1
for _ in range(codeforces):
	n = ini()
	print(factorial(n - 1) // (n // 2))


from math import gcd

def fact(n):
	pro = 1
	for i in range(1, n + 1):
		pro *= i
	return pro

def nCr(n, r):
	(num, den) = (1, 1)
	for i in range(r):
		num *= n - i
		den *= i + 1
		h = gcd(num, den)
		num //= h
		den //= h
	return num // den
n = int(input())
ans = nCr(n, n // 2)
ans *= fact(n // 2 - 1) ** 2
ans //= 2
print(ans)


def fact(n):
	if n == 0:
		return 1
	return fact(n - 1) * n

def comb(a, b):
	return fact(a) // fact(a - b) // fact(b)
n = int(input())
if n == 2:
	print(1)
elif n == 4:
	print(3)
else:
	print(2 * comb(n, n // 2) * (fact(n // 2) // n) ** 2)


import sys
import math

def get_array():
	return list(map(int, sys.stdin.readline().strip().split()))

def get_ints():
	return map(int, sys.stdin.readline().strip().split())

def input():
	return sys.stdin.readline().strip()
n = int(input())
ans = 1
for i in range(1, n):
	ans = ans * i
print(ans // (n // 2))


def fact(n):
	ft = 1
	while n > 0:
		ft = ft * n
		n = n - 1
	return ft
n = int(input())
q = 2 * fact(n) // (n * n)
print(q)


def factorial(n):
	res = 1
	for i in range(1, n + 1):
		res *= i
	return res

def combination(n, r):
	res = factorial(n) / (factorial(r) * factorial(n - r))
	return int(res)
n = int(input())
r = int(n / 2)
res = combination(n, r) * factorial(r - 1) ** 2
print(int(res / 2))


def Fat(n):
	resultado = 1
	for i in range(2, n + 1):
		resultado *= i
	return resultado
x = int(input())
resultado = Fat(x) // (x // 2) // x
print(resultado)


def factorial(n):
	if n < 0:
		return 0
	if n <= 1:
		return 1
	return n * factorial(n - 1)

def ncr(n, r):
	if n < 0 or r < 0 or n < r:
		return 0
	return factorial(n) // factorial(r) // factorial(n - r)
n = int(input())
left_choice = ncr(n, n // 2) // 2
left = factorial(n // 2)
right = left
left = left // (n // 2)
right = right // (n // 2)
print(left_choice * left * right)


from __future__ import division, print_function
import os, sys
from io import BytesIO, IOBase
if sys.version_info[0] < 3:
	from __builtin__ import xrange as range
	from future_builtins import ascii, filter, hex, map, oct, zip

def ii():
	return int(input())

def si():
	return input()

def mi():
	return map(int, input().strip().split(' '))

def msi():
	return map(str, input().strip().split(' '))

def li():
	return list(mi())

def dmain():
	sys.setrecursionlimit(1000000)
	threading.stack_size(1024000)
	thread = threading.Thread(target=main)
	thread.start()
import sys
input = sys.stdin.readline
scanner = lambda : int(input())
string = lambda : input().rstrip()
get_list = lambda : list(read())
read = lambda : map(int, input().split())
get_float = lambda : map(float, input().split())

def ceil(x):
	if x != int(x):
		x = int(x) + 1
	return x

def factorial(x, m):
	val = 1
	while x > 0:
		val = val * x % m
		x -= 1
	return val

def fact(x):
	val = 1
	while x > 0:
		val *= x
		x -= 1
	return val

def swaparr(arr, a, b):
	temp = arr[a]
	arr[a] = arr[b]
	arr[b] = temp

def gcd(a, b):
	if b == 0:
		return a
	return gcd(b, a % b)

def lcm(a, b):
	return a * b // math.gcd(a, b)

def is_integer(n):
	return math.ceil(n) == math.floor(n)

def nCr(n, k):
	if k > n:
		return 0
	if k > n - k:
		k = n - k
	res = 1
	for i in range(k):
		res = res * (n - i)
		res = res / (i + 1)
	return int(res)

def primefs(n):
	primes = {}
	while n % 2 == 0 and n > 0:
		primes[2] = primes.get(2, 0) + 1
		n = n // 2
	for i in range(3, int(n ** 0.5) + 2, 2):
		while n % i == 0 and n > 0:
			primes[i] = primes.get(i, 0) + 1
			n = n // i
	if n > 2:
		primes[n] = primes.get(n, 0) + 1
	return primes

def power(x, y, p):
	if y == 0:
		return 1
	res = 1
	x = x % p
	if x == 0:
		return 0
	while y > 0:
		if y & 1 == 1:
			res = res * x % p
		y = y >> 1
		x = x * x % p
	return res

def swap(a, b):
	temp = a
	a = b
	b = temp
	return (a, b)

def find(x, link):
	p = x
	while p != link[p]:
		p = link[p]
	while x != p:
		nex = link[x]
		link[x] = p
		x = nex
	return p

def union(x, y, link, size):
	x = find(x, link)
	y = find(y, link)
	if size[x] < size[y]:
		(x, y) = swap(x, y)
	if x != y:
		size[x] += size[y]
		link[y] = x

def sieve(n):
	prime = [True for i in range(n + 1)]
	(prime[0], prime[1]) = (False, False)
	p = 2
	while p * p <= n:
		if prime[p] == True:
			for i in range(p * p, n + 1, p):
				prime[i] = False
		p += 1
	return prime

def phi(n):
	result = n
	p = 2
	while p * p <= n:
		if n % p == 0:
			while n % p == 0:
				n = n // p
			result = result * (1.0 - 1.0 / float(p))
		p = p + 1
	if n > 1:
		result = result * (1.0 - 1.0 / float(n))
	return int(result)

def is_prime(n):
	if n == 0:
		return False
	if n == 1:
		return True
	for i in range(2, int(n ** (1 / 2)) + 1):
		if not n % i:
			return False
	return True

def next_prime(n, primes):
	while primes[n] != True:
		n += 1
	return n
MAXN = int(100000.0 + 5)

def spf_sieve():
	spf[1] = 1
	for i in range(2, MAXN):
		spf[i] = i
	for i in range(4, MAXN, 2):
		spf[i] = 2
	for i in range(3, ceil(MAXN ** 0.5), 2):
		if spf[i] == i:
			for j in range(i * i, MAXN, i):
				if spf[j] == j:
					spf[j] = i
spf = [0 for i in range(MAXN)]

def factoriazation(x):
	res = []
	for i in range(2, int(x ** 0.5) + 1):
		while x % i == 0:
			res.append(i)
			x //= i
	if x != 1:
		res.append(x)
	return res

def factors(n):
	res = []
	for i in range(1, int(n ** 0.5) + 1):
		if n % i == 0:
			res.append(i)
			res.append(n // i)
	return list(set(res))

def int_array():
	return list(map(int, input().strip().split()))

def float_array():
	return list(map(float, input().strip().split()))

def str_array():
	return input().strip().split()

def binary_search(low, high, w, h, n):
	while low < high:
		mid = low + (high - low) // 2
		if check(mid, w, h, n):
			low = mid + 1
		else:
			high = mid
	return low

def check(moves, n):
	val = (moves + 1) // 2
	rem = moves - val
	sol = (val + 1) * (rem + 1)
	return sol < n

def sortSecond(val):
	return val[1]
MOD = int(1000000000.0) + 7
CMOD = 998244353
INF = float('inf')
NINF = -float('inf')
alphs = 'abcdefghijklmnopqrstuvwxyz'
from itertools import permutations
import math
import bisect as bis
import random
import sys
import collections as collect
import functools as fnt
from decimal import Decimal

def solve():
	n = scanner()
	print(fact(n) // (n * n // 2))
BUFSIZE = 8192

class FastIO(IOBase):
	newlines = 0

	def __init__(self, file):
		self._fd = file.fileno()
		self.buffer = BytesIO()
		self.writable = 'x' in file.mode or 'r' not in file.mode
		self.write = self.buffer.write if self.writable else None

	def read(self):
		while True:
			b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
			if not b:
				break
			ptr = self.buffer.tell()
			(self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
		self.newlines = 0
		return self.buffer.read()

	def readline(self):
		while self.newlines == 0:
			b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
			self.newlines = b.count(b'\n') + (not b)
			ptr = self.buffer.tell()
			(self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
		self.newlines -= 1
		return self.buffer.readline()

	def flush(self):
		if self.writable:
			os.write(self._fd, self.buffer.getvalue())
			(self.buffer.truncate(0), self.buffer.seek(0))

class IOWrapper(IOBase):

	def __init__(self, file):
		self.buffer = FastIO(file)
		self.flush = self.buffer.flush
		self.writable = self.buffer.writable
		self.write = lambda s: self.buffer.write(s.encode('ascii'))
		self.read = lambda : self.buffer.read().decode('ascii')
		self.readline = lambda : self.buffer.readline().decode('ascii')

def print(*args, **kwargs):
	(sep, file) = (kwargs.pop('sep', ' '), kwargs.pop('file', sys.stdout))
	at_start = True
	for x in args:
		if not at_start:
			file.write(sep)
		file.write(str(x))
		at_start = False
	file.write(kwargs.pop('end', '\n'))
	if kwargs.pop('flush', False):
		file.flush()
if sys.version_info[0] < 3:
	(sys.stdin, sys.stdout) = (FastIO(sys.stdin), FastIO(sys.stdout))
else:
	(sys.stdin, sys.stdout) = (IOWrapper(sys.stdin), IOWrapper(sys.stdout))
input = lambda : sys.stdin.readline().rstrip('\r\n')
t = 1
for i in range(t):
	solve()


from collections import Counter, OrderedDict
from itertools import permutations as perm
from collections import deque
from sys import stdin
from bisect import *
from heapq import *
import math
g = lambda : stdin.readline().strip()
gl = lambda : g().split()
gil = lambda : [int(var) for var in gl()]
gfl = lambda : [float(var) for var in gl()]
gcl = lambda : list(g())
gbs = lambda : [int(var) for var in g()]
mod = int(1000000000.0) + 7
inf = float('inf')
t = 1
for _ in range(t):
	(n,) = gil()
	fac = [1]
	for i in range(1, n + 1):
		fac.append(i * fac[-1])
	n //= 2
	ans = fac[2 * n]
	ans //= 2 * n * n
	print(ans)


fib = {}

def f(n: int):
	if n <= 1:
		return 1
	if n in fib:
		return fib[n]
	else:
		fib[n] = n * f(n - 1)
		return fib[n]

def C(a, b):
	return f(a) // f(b) // f(a - b)

def fun(n):
	return C(n, n // 2) // 2 * f(n // 2 - 1) * f(n // 2 - 1)
n = int(input())
print(fun(n))


from math import factorial as f

def Solve():
	n = ri()
	print(f(n - 1) // (n // 2))
import sys
inp = sys.stdin.buffer.readline
rl = lambda : list(map(int, inp().split()))
ri = lambda : int(inp())
rs = lambda : inp().decode().strip()
Testcase = 1
for Test in range(Testcase):
	Solve()


test = int(input())
frac = 1
for i in range(1, test + 1):
	frac *= i
test1 = int(test / 2)
ans = int(frac / (test1 * test))
print(ans)


import math as math
n = int(input())
k = n // 2
print(math.factorial(n) // (2 * math.factorial(n - k) * math.factorial(k)) * math.factorial(k - 1) ** 2)


def fac(n):
	ans = 1
	while n:
		ans *= n
		n -= 1
	return ans
n = int(input().strip())
ans = fac(n)
val = fac(n // 2)
ans //= val * val * 2
val = fac(n // 2 - 1)
ans *= val * val
print(ans)


def factorial(a):
	if a == 1:
		return 1
	else:
		return factorial(a - 1) * a
n = int(input())
print(int(factorial(n) / ((n / 2) ** 2 * 2)))


n = int(input())

def in_cache(func):
	cache = {}

	def wrapper(n):
		if n in cache:
			return cache[n]
		else:
			cache[n] = func(n)
			return cache[n]
	return wrapper

@in_cache
def factorial_recursive(n):
	return n * factorial_recursive(n - 1) if n > 1 else 1
fac = factorial_recursive(n)
print(fac // (n * (n // 2)))


from __future__ import division, print_function
from fractions import Fraction
import sys
import os
from io import BytesIO, IOBase
from functools import cmp_to_key
from heapq import *
from math import gcd, factorial, floor, ceil
from copy import deepcopy
from collections import deque
from bisect import bisect_left as bl
from bisect import bisect_right as br
from bisect import bisect
BUFSIZE = 8192

class FastIO(IOBase):
	newlines = 0

	def __init__(self, file):
		self._fd = file.fileno()
		self.buffer = BytesIO()
		self.writable = 'x' in file.mode or 'r' not in file.mode
		self.write = self.buffer.write if self.writable else None

	def read(self):
		while True:
			b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
			if not b:
				break
			ptr = self.buffer.tell()
			(self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
		self.newlines = 0
		return self.buffer.read()

	def readline(self):
		while self.newlines == 0:
			b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
			self.newlines = b.count(b'\n') + (not b)
			ptr = self.buffer.tell()
			(self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
		self.newlines -= 1
		return self.buffer.readline()

	def flush(self):
		if self.writable:
			os.write(self._fd, self.buffer.getvalue())
			(self.buffer.truncate(0), self.buffer.seek(0))

class IOWrapper(IOBase):

	def __init__(self, file):
		self.buffer = FastIO(file)
		self.flush = self.buffer.flush
		self.writable = self.buffer.writable
		self.write = lambda s: self.buffer.write(s.encode('ascii'))
		self.read = lambda : self.buffer.read().decode('ascii')
		self.readline = lambda : self.buffer.readline().decode('ascii')

def print(*args, **kwargs):
	(sep, file) = (kwargs.pop('sep', ' '), kwargs.pop('file', sys.stdout))
	at_start = True
	for x in args:
		if not at_start:
			file.write(sep)
		file.write(str(x))
		at_start = False
	file.write(kwargs.pop('end', '\n'))
	if kwargs.pop('flush', False):
		file.flush()
if sys.version_info[0] < 3:
	(sys.stdin, sys.stdout) = (FastIO(sys.stdin), FastIO(sys.stdout))
else:
	(sys.stdin, sys.stdout) = (IOWrapper(sys.stdin), IOWrapper(sys.stdout))
from types import GeneratorType

def iterative(f, stack=[]):

	def wrapped_func(*args, **kwargs):
		if stack:
			return f(*args, **kwargs)
		to = f(*args, **kwargs)
		while True:
			if type(to) is GeneratorType:
				stack.append(to)
				to = next(to)
				continue
			stack.pop()
			if not stack:
				break
			to = stack[-1].send(to)
		return to
	return wrapped_func

def inp():
	return sys.stdin.readline().rstrip('\r\n')

def out(var):
	sys.stdout.write(str(var))

def lis():
	return list(map(int, inp().split()))

def stringlis():
	return list(map(str, inp().split()))

def sep():
	return map(int, inp().split())

def strsep():
	return map(str, inp().split())

def zerolist(n):
	return [0] * n

def nextline():
	out('\n')

def testcase(t):
	for pp in range(t):
		solve(pp)

def printlist(a):
	for p in range(0, len(a)):
		out(str(a[p]) + ' ')

def google(p):
	print('Case #' + str(p) + ': ', end='')

def lcm(a, b):
	return a * b // gcd(a, b)

def power(x, y, p):
	res = 1
	x = x % p
	if x == 0:
		return 0
	while y > 0:
		if y & 1 == 1:
			res = res * x % p
		y = y >> 1
		x = x * x % p
	return res

def ncr(n, r):
	return factorial(n) // (factorial(r) * factorial(max(n - r, 1)))

def isPrime(n):
	if n <= 1:
		return False
	if n <= 3:
		return True
	if n % 2 == 0 or n % 3 == 0:
		return False
	i = 5
	while i * i <= n:
		if n % i == 0 or n % (i + 2) == 0:
			return False
		i = i + 6
	return True
inf = pow(10, 20)
mod = 998244353

def solve(case):
	a = [0, 1, 1, 3, 8, 40, 180, 1260, 8064, 72576, 604800, 6652800, 68428800, 889574400, 10897286400, 163459296000, 2324754432000, 39520825344000, 640237370572800, 12164510040883200]
	print(a[int(inp()) - 1])
testcase(1)


def fatorial(n):
	soma = 1
	for i in range(1, n + 1):
		soma = soma * i
	return soma
n = int(input())
sup = fatorial(n - 1)
low = n // 2
print(sup // low)


def run():
	import sys
	sys.stdin = open('/home/punit/Documents/Cpp Programs/input.txt', 'r')
	sys.stdout = open('/home/punit/Documents/Cpp Programs/output.txt', 'w')
	from math import ceil, sqrt, floor

def ans(n):
	res = 1
	x = n // 2
	for i in range(2, n):
		if i == x:
			continue
		else:
			res = res * i
	return res
n = int(input())
print(ans(n))


import sys
input = sys.stdin.readline
I = lambda : list(map(int, input().split()))

def fact(n):
	if n <= 1:
		return 1
	return n * fact(n - 1)
(n,) = I()
print(fact(n - 1) // (n // 2))


from __future__ import division, print_function
from io import BytesIO, IOBase
import os, sys, math, heapq, copy
from collections import defaultdict, deque, Counter
from bisect import bisect_left, bisect_right
from functools import cmp_to_key
from itertools import permutations, combinations, combinations_with_replacement
if sys.version_info[0] < 3:
	from __builtin__ import xrange as range
	from future_builtins import ascii, filter, hex, map, oct, zip
BUFSIZE = 8192

class FastIO(IOBase):
	newlines = 0

	def __init__(self, file):
		self._fd = file.fileno()
		self.buffer = BytesIO()
		self.writable = 'x' in file.mode or 'r' not in file.mode
		self.write = self.buffer.write if self.writable else None

	def read(self):
		while True:
			b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
			if not b:
				break
			ptr = self.buffer.tell()
			(self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
		self.newlines = 0
		return self.buffer.read()

	def readline(self):
		while self.newlines == 0:
			b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
			self.newlines = b.count(b'\n') + (not b)
			ptr = self.buffer.tell()
			(self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
		self.newlines -= 1
		return self.buffer.readline()

	def flush(self):
		if self.writable:
			os.write(self._fd, self.buffer.getvalue())
			(self.buffer.truncate(0), self.buffer.seek(0))

class IOWrapper(IOBase):

	def __init__(self, file):
		self.buffer = FastIO(file)
		self.flush = self.buffer.flush
		self.writable = self.buffer.writable
		self.write = lambda s: self.buffer.write(s.encode('ascii'))
		self.read = lambda : self.buffer.read().decode('ascii')
		self.readline = lambda : self.buffer.readline().decode('ascii')

def print(*args, **kwargs):
	(sep, file) = (kwargs.pop('sep', ' '), kwargs.pop('file', sys.stdout))
	at_start = True
	for x in args:
		if not at_start:
			file.write(sep)
		file.write(str(x))
		at_start = False
	file.write(kwargs.pop('end', '\n'))
	if kwargs.pop('flush', False):
		file.flush()
if sys.version_info[0] < 3:
	(sys.stdin, sys.stdout) = (FastIO(sys.stdin), FastIO(sys.stdout))
else:
	(sys.stdin, sys.stdout) = (IOWrapper(sys.stdin), IOWrapper(sys.stdout))
input = lambda : sys.stdin.readline().rstrip('\r\n')
mod = 1000000007

def get_int():
	return int(sys.stdin.readline().strip())

def get_str():
	return sys.stdin.readline().strip()

def get_float():
	return float(sys.stdin.readline().strip())

def get_ints():
	return map(int, sys.stdin.readline().strip().split())

def get_strs():
	return map(str, sys.stdin.readline().strip().split())

def get_floats():
	return map(float, sys.stdin.readline().strip().split())

def list_ints():
	return list(map(int, sys.stdin.readline().strip().split()))

def list_strs():
	return list(map(str, sys.stdin.readline().strip().split()))

def list_floats():
	return list(map(float, sys.stdin.readline().strip().split()))
n = get_int()
ans = 1
for i in range(1, n + 1):
	ans *= i
ans //= n // 2
ans //= n // 2
ans //= 2
print(ans)


k = int(input()) // 2
ans = 1
for i in range(1, 2 * k):
	ans *= i
print(ans // k)


import math
a = int(input())
if a == 2:
	perms = 1
else:
	perms = math.factorial(a) / math.factorial(int(a / 2))
	perms = int(perms / 2) / math.factorial(int(a / 2))
hh = int(a / 2)
ll = int(math.factorial(hh - 1))
perms *= ll * ll
print(int(perms))


import sys
import math as m

def main():
	pass

def binary(n):
	return bin(n).replace('0b', '')

def decimal(s):
	return int(s, 2)

def pow2(n):
	p = 0
	while n > 1:
		n //= 2
		p += 1
	return p

def isPrime(n):
	if n == 1:
		return False
	else:
		root = int(n ** 0.5)
		root += 1
		for i in range(2, root):
			if n % i == 0:
				return False
		return True

def lts(l):
	s = ''.join(map(str, l))
	return s

def stl(s):
	l = list(s)
	return l

def sq(a, target, arr=[]):
	s = sum(arr)
	if s == target:
		return arr
	if s >= target:
		return
	for i in range(len(a)):
		n = a[i]
		remaining = a[i + 1:]
		ans = sq(remaining, target, arr + [n])
		if ans:
			return ans
mod = int(1000000000.0) + 7

def sinp():
	return sys.stdin.readline().strip()

def iinp():
	return int(input())

def ninp():
	return map(int, sys.stdin.readline().strip().split())

def llinp():
	return list(map(int, sys.stdin.readline().strip().split()))

def p(xyz):
	print(xyz)

def p2(a, b):
	print(a, b)
n = iinp()
if n == 2:
	print(1)
elif n == 4:
	print(3)
elif n == 6:
	print(10 * (6 // 3) * (6 // 3))
elif n == 8:
	print(35 * 24 // 4 * 24 // 4)
elif n == 10:
	print(126 * 120 // 5 * 120 // 5)
elif n == 12:
	print(462 * 720 // 6 * 720 // 6)
elif n == 14:
	print(1716 * 5040 // 7 * 5040 // 7)
elif n == 16:
	print(6435 * 40320 // 8 * 40320 // 8)
elif n == 18:
	print(24310 * 362880 // 9 * 362880 // 9)
elif n == 20:
	print(92378 * 3628800 // 10 * 3628800 // 10)


from math import *
from sys import *

def fact(x):
	c = 1
	for i in range(1, x + 1):
		c *= i
	return c
n = int(input())
x = fact(n - 1)
print(x // (n // 2))


import sys, bisect, string, math, time, functools, random, fractions
from heapq import heappush, heappop, heapify
from collections import deque, defaultdict, Counter
from itertools import permutations, combinations, groupby
rep = range
R = range

def Golf():
	(n, *t) = map(int, open(0).read().split())

def I():
	return int(input())

def S_():
	return input()

def IS():
	return input().split()

def LS():
	return [i for i in input().split()]

def MI():
	return map(int, input().split())

def LI():
	return [int(i) for i in input().split()]

def LI_():
	return [int(i) - 1 for i in input().split()]

def NI(n):
	return [int(input()) for i in range(n)]

def NI_(n):
	return [int(input()) - 1 for i in range(n)]

def NLI(n):
	return [[int(i) for i in input().split()] for i in range(n)]

def NLI_(n):
	return [[int(i) - 1 for i in input().split()] for i in range(n)]

def StoLI():
	return [ord(i) - 97 for i in input()]

def ItoS(n):
	return chr(n + 97)

def LtoS(ls):
	return ''.join([chr(i + 97) for i in ls])

def RA():
	return map(int, open(0).read().split())

def RLI(n=8, a=1, b=10):
	return [random.randint(a, b) for i in range(n)]

def RI(a=1, b=10):
	return random.randint(a, b)

def INP():
	N = 10
	A = 10
	n = random.randint(1, N)
	a = [random.randint(1, A) for i in range(n)]
	return (n, a)

def Rtest(T):
	(case, err) = (0, 0)
	for i in range(T):
		inp = INP()
		a1 = naive(*inp)
		a2 = solve(*inp)
		if a1 != a2:
			print((a1, a2), inp)
			err += 1
		case += 1
	print('Tested', case, 'case with', err, 'errors')

def GI(V, E, ls=None, Directed=False, index=1):
	org_inp = []
	g = [[] for i in range(V)]
	FromStdin = True if ls == None else False
	for i in range(E):
		if FromStdin:
			inp = LI()
			org_inp.append(inp)
		else:
			inp = ls[i]
		if len(inp) == 2:
			(a, b) = inp
			c = 1
		else:
			(a, b, c) = inp
		if index == 1:
			a -= 1
			b -= 1
		aa = (a, c)
		bb = (b, c)
		g[a].append(bb)
		if not Directed:
			g[b].append(aa)
	return (g, org_inp)

def GGI(h, w, search=None, replacement_of_found='.', mp_def={'#': 1, '.': 0}, boundary=1):
	mp = [boundary] * (w + 2)
	found = {}
	for i in R(h):
		s = input()
		for char in search:
			if char in s:
				found[char] = (i + 1) * (w + 2) + s.index(char) + 1
				mp_def[char] = mp_def[replacement_of_found]
		mp += [boundary] + [mp_def[j] for j in s] + [boundary]
	mp += [boundary] * (w + 2)
	return (h + 2, w + 2, mp, found)

def TI(n):
	return GI(n, n - 1)

def accum(ls):
	rt = [0]
	for i in ls:
		rt += [rt[-1] + i]
	return rt

def bit_combination(n, base=2):
	rt = []
	for tb in R(base ** n):
		s = [tb // base ** bt % base for bt in R(n)]
		rt += [s]
	return rt

def gcd(x, y):
	if y == 0:
		return x
	if x % y == 0:
		return y
	while x % y != 0:
		(x, y) = (y, x % y)
	return y

def YN(x):
	print(['NO', 'YES'][x])

def Yn(x):
	print(['No', 'Yes'][x])

def show(*inp, end='\n'):
	if show_flg:
		print(*inp, end=end)
mo = 10 ** 9 + 7
inf = float('inf')
FourNb = [(-1, 0), (1, 0), (0, 1), (0, -1)]
EightNb = [(-1, 0), (1, 0), (0, 1), (0, -1), (1, 1), (-1, -1), (1, -1), (-1, 1)]
compas = dict(zip('WENS', FourNb))
cursol = dict(zip('LRUD', FourNb))
l_alp = string.ascii_lowercase
read = sys.stdin.buffer.read
readline = sys.stdin.buffer.readline
input = lambda : sys.stdin.readline().rstrip()

class Comb:

	def __init__(self, n, mo=10 ** 9 + 7):
		self.fac = [0] * (n + 1)
		self.inv = [1] * (n + 1)
		self.fac[0] = 1
		self.fact(n)
		for i in range(1, n + 1):
			self.fac[i] = i * self.fac[i - 1]
			self.inv[n] *= i
			self.inv[n] %= mo
		self.inv[n] = pow(self.inv[n], mo - 2, mo)
		for i in range(1, n):
			self.inv[n - i] = self.inv[n - i + 1] * (n - i + 1)
		return

	def fact(self, n):
		return self.fac[n]

	def invf(self, n):
		return self.inv[n]

	def comb(self, x, y):
		if y < 0 or y > x:
			return 0
		return self.fac[x] // self.fac[y] // self.fac[x - y]

def Golf_Comb(x, y, n=10 ** 5, M=10 ** 9 + 7):
	M = 10 ** 9 + 7
	F = [1]
	for i in range(n):
		F += (F[i] * -~i % M,)
	C = lambda A, B: F[A] * pow(F[A - B] * F[B], M - 2, M) % M
	return C(x, y)
show_flg = False
show_flg = True
ans = 0
for _ in range(1):
	ans = 0
	n = I()
	m = n // 2
	cm = Comb(200)
	ans = 2 * cm.comb(n, m) * (cm.fact(m - 1) // 2) ** 2
	if n == 2:
		ans = 1
	elif n == 4:
		ans = 3
	print(ans)


def fact(n):
	if n < 2:
		return 1
	return n * fact(n - 1)
n = int(input())
ans = 1
ans *= fact(n)
ans //= n // 2
ans //= n // 2
ans //= 2
print(ans)


import math
t = int(input())
c = 2 * math.factorial(t - 1) / t
print(int(c))


def f(a):
	res = 1
	for i in range(1, 1 + a):
		res *= i
	return res
n = int(input())
print(f(n) * f(n // 2 - 1) ** 2 // f(n // 2) ** 2 // 2)


A = [1, 1, 2, 6]
for i in range(4, 21):
	A += [A[-1] * i]
N = int(input())
print(A[N] // (2 * (N // 2) ** 2))


n = int(input())
ans = 1
for i in range(n // 2 + 1, n + 1):
	ans *= i
k = 1
for i in range(1, n // 2 + 1):
	k *= i
a = k // (n // 2)
print(ans // k * a * a // 2)


def fact(n):
	f = [1]
	for i in range(1, n + 1):
		f.append(f[-1] * i)
	return f
n = int(input())
if n == 2:
	print(1)
else:
	fac = fact(n)
	n = n // 2
	v = fac[2 * n] // (2 * n * n)
	print(v)


n = int(input())
if n == 2:
	print(1)
	exit(0)
if n == 4:
	print(3)
	exit(0)
fac = lambda x: 1 if x <= 1 else x * fac(x - 1)
ans = lambda n: int(fac(n) // (fac(n // 2) * fac(n // 2))) * 2 * int((fac(n // 2 - 1) / 2) ** 2)
print(ans(n))


import math as mt
import bisect
import sys
input = sys.stdin.readline
import collections
import heapq
t = 1
p = 10 ** 9 + 7

def ncr_util():
	inv[0] = inv[1] = 1
	fact[0] = fact[1] = 1
	for i in range(2, 300001):
		inv[i] = inv[i % p] * (p - p // i) % p
	for i in range(1, 300001):
		inv[i] = inv[i - 1] * inv[i] % p
		fact[i] = fact[i - 1] * i % p

def solve():
	ans = 1
	for i in range(n):
		ans *= n - i
	return ans // (n // 2 * n)
for _ in range(t):
	n = int(input())
	print(solve())


import sys

def readnum():
	input = sys.stdin.readline
	a = list(map(int, input().split()))
	return a

def printf(val):
	sys.stdout.write(str(val) + '\n')

def power(a, b, mod):
	if b == 1:
		return a
	if b == 0:
		return 1
	ans = power(a, b // 2, mod)
	ans *= ans
	if b % 2:
		ans *= a
	ans = ans % mod
	return ans

def factorial(n, start=1, skip=None):
	res = start
	for i in range(1, n + 1):
		if i == skip:
			continue
		res *= i
	return res

def make_deg(l):
	deg = {}
	for i in l:
		if not i in deg:
			deg[i] = 0
		deg[i] += 1
	return deg
n = readnum()[0]
print(factorial(n // 2 - 1) * factorial(n - 1) // factorial(n - n // 2))


def fact(n):
	if n == 1:
		return n
	return n * fact(n - 1)
n = int(input())
if n == 2:
	print(1)
	exit()
num = 1
den = 1
for i in range(n // 2 + 1, n + 1):
	num *= i
for i in range(1, n // 2 + 1):
	den *= i
c = num // den
res = c * (fact(n // 2 - 1) * fact(n // 2 - 1)) // 2
print(res)


import math
n = int(input())
ans = int(2 * math.factorial(n) / pow(n, 2))
print(ans)


import math
n = int(input())
a = [0 for i in range(22)]
a[2] = 1
a[4] = 3
a[6] = 40
a[8] = 1260
a[10] = 72576
a[12] = 6652800
a[14] = 889574400
a[16] = 163459296000
a[18] = 39520825344000
a[20] = 12164510040883200
print(a[n])


def factorial(x):
	ans = 1
	while x > 0:
		ans *= x
		x -= 1
	return ans

def ncr(n, r):
	return factorial(n) // (factorial(r) * factorial(n - r))
n = int(input())
ans = ncr(n, n // 2)
ans = ans * factorial(n // 2 - 1) ** 2
print(ans // 2)


n = int(input())
n //= 2
answer = 1
for i in range(1, 2 * n + 1):
	answer *= i
answer //= n
answer //= n
print(answer // 2)


from sys import stdin, stdout
fact = [1]
for i in range(1, 22):
	fact += [fact[-1] * i]

def nCr(n, r):
	return fact[n] // (fact[r] * fact[n - r])
for _ in range(1):
	n = int(stdin.readline())
	pair = n // 2
	ans = fact[n] // (n // 2 * n // 2 * 2)
	print(ans)


import math
n = int(input())
fact = math.factorial(n)
ans = 2 * fact
ans = ans // n ** 2
print(ans)


def ncr(n, r):
	return fact[n] // (fact[r] * fact[n - r])
n = int(input())
fact = [1 for i in range(25)]
for i in range(2, 25):
	fact[i] = fact[i - 1] * i
if n == 2:
	print(1)
	quit()
if n == 4:
	print(3)
	quit()
z = ncr(n, n // 2) // 2
z = z * (fact[n // 2 - 1] * fact[n // 2 - 1])
print(z)


ans = 1
n = int(input())
for i in range(1, n + 1):
	ans *= i
for j in range(2, n // 2 + 1):
	ans //= j
	ans //= j
ans //= 2
for i in range(1, n // 2):
	ans *= i
	ans *= i
print(ans)


def factorial(n):
	return 1 if n == 1 or n == 0 else n * factorial(n - 1)
x = int(input())
ans = factorial(x)
f = x // 2
f = f * f * 2
print(ans // f)


import sys
import math

def II():
	return int(sys.stdin.readline())

def LI():
	return list(map(int, sys.stdin.readline().split()))

def MI():
	return map(int, sys.stdin.readline().split())

def SI():
	return sys.stdin.readline().strip()
n = II()
ans = 1
if n == 2:
	print(1)
else:
	x = n // 2
	for i in range(1, n + 1):
		ans *= i
	print(ans // x // x // 2)


from math import factorial as fac
n = int(input())
p = fac(n) // (fac(n // 2) * fac(n // 2))
q = fac(n // 2 - 1)
print(p * q * q // 2)