# https://github.com/robe2222555/atcoder-lib/blob/main/template/python/main.py import sys input = lambda: sys.stdin.readline().rstrip() def LI(): return list(map(int, input().split())) def II(): return int(input()) INF = 1<<60 # https://github.com/robe2222555/atcoder-lib/blob/main/3_数学/組み合わせ/組み合わせ計算.py LIM = 1<<20 mod = 998244353 fac=[1]*LIM ninv=[1]*LIM finv=[1]*LIM for i in range(2, LIM): fac[i] = fac[i-1]*i%mod ninv[i] = (-(mod//i)*ninv[mod%i])%mod finv[i] = finv[i-1]*ninv[i]%mod def binom(n,k): if n<0 or k<0: return 0 if k>n: return 0 return (fac[n]*finv[k]%mod)*finv[n-k]%mod def nPk(n,k): return fac[n]*finv[n-k]%mod def solve(): N = II() # dp[i][j] := 席 0...i で,iに人が座り,合計人数 j で座る場合の数(順不同) dp = [[0]*(N+1) for _ in range(N)] dp[0][1] = 1 if 1=0: dp[i][j] += dp[i-2][j-1] if i-3>=0: dp[i][j] += dp[i-3][j-1] dp[i][j] %= mod ans = 0 for i in range(N+1): if dp[-1][i]>0: res = 1 res = fac[i]*fac[N-i]%mod res = res*dp[-1][i]%mod ans = (ans + res)%mod if N>1 and dp[-2][i]>0: res = 1 res = fac[i]*fac[N-i]%mod res = res*dp[-2][i]%mod ans = (ans + res)%mod print(ans) return def main(): T = 1 for _ in range(T): solve() return if __name__ == '__main__': main()