import math N = int(input()) M = 998244353 def h(n): if n <= 0: return 0 m = math.isqrt(n) return ( ((m - 1) * m * (2 * m - 1) * (3 * m * m - 3 * m - 1)) // 15 + 3 * (((m - 1) * m) // 2) ** 2 + ((m - 1) * m * (2 * m - 1)) // 6 + m * ((n * (n + 1)) // 2 - ((m * m - 1) * (m * m)) // 2) ) next_u = [1] * 60 next_ui = [1] * 60 for k in range(3, 60): next_ui[k] += 1 next_u[k] = next_ui[k] ** k u_time = [1] u_change = [] v = 1 while v <= N: min_u = next_u[3] for k in range(3, 60): if min_u > next_u[k]: min_u = next_u[k] ks = [] for k in range(3, 60): if next_u[k] == min_u: ks.append(k) for k in ks: next_ui[k] += 1 next_u[k] = next_ui[k] ** k if u_time[-1] != min_u: u_time.append(min_u) u_change.append(ks) v = min_u ans = 0 f = False max_c = int(N ** (1 / 3)) + 10 while (max_c + 1) ** 3 <= N: max_c += 1 while max_c**3 > N: max_c -= 1 max_c += 10 inv = [0] * (max_c + 1) inv[1] = 1 for i in range(2, max_c + 1): inv[i] = M - (M // i) * inv[M % i] % M cu = [1] * 60 p = 1 for i in range(len(u_time) - 1): u_i = u_time[i] u_i1 = u_time[i + 1] if u_i1 > N: u_i1 = N + 1 f = True seg = (h(u_i1 - 1) - h(u_i - 1)) % M ans = (ans + p * seg) % M if f: break for k in u_change[i]: old = cu[k] cu[k] += 1 new = cu[k] p = p * inv[old] % M p = p * new % M print(ans)