from math import isqrt import heapq N = int(input()) M = 998244353 def h(n): if n <= 0: return 0 m = isqrt(n) return ( ((m - 1) * m * (2 * m - 1) * (3 * m * m - 3 * m - 1)) // 15 % M + 3 * (((m - 1) * m) // 2) ** 2 % M + ((m - 1) * m * (2 * m - 1)) // 6 % M + m * ((n * (n + 1)) // 2 % M - ((m * m - 1) * (m * m)) // 2) % M ) % M next_u = [1] * 60 next_ui = [1] * 60 for k in range(3, 60): next_ui[k] = 2 next_u[k] = 1 << k hq = [(next_u[k], k) for k in range(3, 60)] heapq.heapify(hq) 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 ans = 0 v = 1 prev_h = 0 while v <= N: min_u, k = heapq.heappop(hq) ks = [k] while hq and hq[0][0] == min_u: ks.append(heapq.heappop(hq)[1]) if min_u > N: cur_h = h(N) ans = (ans + p * (cur_h - prev_h)) % M break cur_h = h(min_u - 1) ans = (ans + p * (cur_h - prev_h)) % M for k in ks: old = cu[k] cu[k] += 1 new = cu[k] p = p * inv[old] % M p = p * new % M next_ui[k] += 1 next_u[k] = next_ui[k] ** k heapq.heappush(hq, (next_u[k], k)) v = min_u prev_h = cur_h print(ans)