## https://yukicoder.me/problems/no/2083 MOD = 998244353 class CombinationCalculator: """ modを考慮したPermutation, Combinationを計算するためのクラス """ def __init__(self, size, mod): self.mod = mod self.factorial = [0] * (size + 1) self.factorial[0] = 1 for i in range(1, size + 1): self.factorial[i] = (i * self.factorial[i - 1]) % self.mod self.inv_factorial = [0] * (size + 1) self.inv_factorial[size] = pow(self.factorial[size], self.mod - 2, self.mod) for i in reversed(range(size)): self.inv_factorial[i] = ((i + 1) * self.inv_factorial[i + 1]) % self.mod def calc_combination(self, n, r): if n < 0 or n < r or r < 0: return 0 if r == 0 or n == r: return 1 ans = self.inv_factorial[n - r] * self.inv_factorial[r] ans %= self.mod ans *= self.factorial[n] ans %= self.mod return ans def calc_permutation(self, n, r): if n < 0 or n < r: return 0 ans = self.inv_factorial[n - r] ans *= self.factorial[n] ans %= self.mod return ans def main(): N = int(input()) combi = CombinationCalculator(N, MOD) array = [0] * (N + 1) for m in range(1, N + 1): ans = pow(2, m, MOD) ans -= m ans %= MOD array[m] = ans p_array = [[0] * (N + 1) for _ in range(N)] p_array[0] = [1] * (N + 1) p_array[1] = array for l in range(2, N): for m in range(1, N + 1): p_array[l][m] = (array[m] * p_array[l - 1][m]) % MOD # 空集合分 answer = 1 for m in range(1, N + 1): if m == 1: dp = [0, 0] dp[1] = 1 else: new_dp = [0] * (m + 1) for m_ in range(1, len(dp)): new_dp[m_] += (dp[m_] * m_) % MOD new_dp[m_] %= MOD new_dp[m_ + 1] += dp[m_] new_dp[m_ + 1] %= MOD dp = new_dp coef = combi.calc_combination(N, m) ans = 0 if m < N: for m_ in range(1, m + 1): ans += (dp[m_] * p_array[N - m][m_]) % MOD ans %= MOD else: for m_ in range(1, m + 1): ans += dp[m_] ans %= MOD ans *= coef ans %= MOD answer += ans answer %= MOD print(answer) if __name__ == '__main__': main()