from math import isqrt import sys MOD = 998244353 INV2 = 499122177 INV6 = 166374059 INV30 = 432572553 def cube_root_floor(n: int) -> int: x = int(n ** (1 / 3)) while (x + 1) ** 3 <= n: x += 1 while x ** 3 > n: x -= 1 return x def sum2(n: int) -> int: if n <= 0: return 0 a = n % MOD b = (n + 1) % MOD c = (2 * a + 1) % MOD return a * b % MOD * c % MOD * INV6 % MOD def sum3(n: int) -> int: if n <= 0: return 0 a = n % MOD b = (n + 1) % MOD s = a * b % MOD * INV2 % MOD return s * s % MOD def sum4(n: int) -> int: if n <= 0: return 0 a = n % MOD b = (n + 1) % MOD c = (2 * a + 1) % MOD d = (3 * a * a + 3 * a - 1) % MOD return a * b % MOD * c % MOD * d % MOD * INV30 % MOD def range_sum(l: int, r: int) -> int: return ((r - l + 1) % MOD) * ((l + r) % MOD) % MOD * INV2 % MOD def pref(x: int) -> int: if x <= 0: return 0 r = isqrt(x) m = r - 1 return ( 2 * sum4(m) + 3 * sum3(m) + sum2(m) + (r % MOD) * range_sum(r * r, x) ) % MOD def main() -> None: n = int(sys.stdin.readline()) max_root = cube_root_floor(n) inv = [0] * (max_root + 1) if max_root >= 1: inv[1] = 1 for i in range(2, max_root + 1): inv[i] = (MOD - (MOD // i) * inv[MOD % i]) % MOD events = [] for k in range(3, 61): x = 1 << k if x > n: break r = 2 while x <= n: events.append((x, r)) r += 1 x = pow(r, k) events.sort() ans = 0 prod = 1 left = 1 i = 0 while left <= n: next_pos = events[i][0] if i < len(events) else n + 1 right = min(n, next_pos - 1) if left <= right: ans = (ans + prod * (pref(right) - pref(left - 1))) % MOD left = right + 1 continue while i < len(events) and events[i][0] == left: _, r = events[i] prod = prod * r % MOD * inv[r - 1] % MOD i += 1 print(ans) if __name__ == "__main__": main()