## https://yukicoder.me/problems/no/2902 MOD = 998244353 def main(): N = int(input()) # 2以上N以下の素数を列挙 primes = [True] * (N + 1) for p in range(2, N + 1): if not primes[p]: continue x = 2 * p while x <= N: primes[x] = False x += p # N! に含まれる素数p の最大の肩を計算 primes_array = [] for p in range(2, N + 1): if not primes[p]: continue x = p cnt = 0 while x <= N: cnt += N // x x *= p primes_array.append((p, cnt)) primes_array.sort(key=lambda x : x[1], reverse=True) # 答えを計算 answer = 0 max_x = primes_array[0][1] for p in range(1, max_x + 1): a = 1 for i in range(len(primes_array)): _, c = primes_array[i] if c < p: break x = c // p a *= (x + 1) a %= MOD a -= 1 a %= MOD answer += a answer %= MOD print(answer) if __name__ == "__main__": main()