def isqrt(x: int, root=2): assert 0 <= x assert root >= 1 if x == 0 or x == 1: return x if root == 1: return x res = int(x**(1/root)) while res**root < x: res += 1 while res**root > x: res -= 1 return res MOD = 998_244_353 N = int(input()) data = bytearray((0, 1)) * ((N+1) // 2) data[:3] = [0, 0, 1] for x in range(3, isqrt(N) + 1): if data[x] == 1: for y in range(x*x, len(data), x): data[y] = 0 P = tuple(n for n, is_prime in enumerate(data) if is_prime) L = [0]*(N+1) for p in P: L[p] = N X = N while X: X, r = X//p, X%p L[p] -= r L[p] //= p-1 def recips(N, MOD): assert 0 <= N and 1 < MOD INF = float("INF") if N == 0: return [INF] dp = [INF] * (N+1) dp[1] = 1 for x in range(2, N+1): q, r = divmod(MOD, x) if dp[r] == 0: try: dp[x] = pow(x, -1, MOD) except ValueError: pass else: dp[x] = -(q) * dp[r] % MOD return dp I = recips(N + 100, MOD) def quot_range(N): assert N >= 1 res = [] l = 1 while l <= N: q = N//l r = N//q res.append((q, (l, r+1))) l = r+1 return res M = [1]*(N+2) for p in P: for q, (l, r) in quot_range(L[p]): M[l] *= q+1 M[r] *= I[q+1] M[l] %= MOD M[r] %= MOD M.pop() from itertools import accumulate Z = list(accumulate(M, lambda x, y: x*y%MOD)) Z = [z-1 for z in Z] ans = sum(Z) % MOD print(ans)