import sys import math from collections import defaultdict input_data = sys.stdin.read().split() N = int(input_data[0]) MOD = 998244353 INV2 = pow(2, MOD - 2, MOD) INV4 = pow(4, MOD - 2, MOD) INV6 = pow(6, MOD - 2, MOD) INV30 = pow(30, MOD - 2, MOD) def F(R): if R <= 0: return 0 m = math.isqrt(R) n = (m - 1) % MOD S2 = n * (n + 1) % MOD * (2 * n + 1) % MOD * INV6 % MOD S3 = n * n % MOD * (n + 1) % MOD * (n + 1) % MOD * INV4 % MOD poly = (3 * n * n + 3 * n - 1) % MOD S4 = n * (n + 1) % MOD * (2 * n + 1) % MOD * poly % MOD * INV30 % MOD sum1 = (2 * S4 + 3 * S3 + S2) % MOD count = (R - m * m + 1) % MOD sum2_val = (m * m + R) % MOD * count % MOD * INV2 % MOD sum2 = (m % MOD) * sum2_val % MOD return (sum1 + sum2) % MOD events = defaultdict(list) for k in range(3, 60): x = 2 while True: p = x ** k if p > N: break events[p].append((k, x)) x += 1 boundaries = sorted(list(events.keys())) if not boundaries or boundaries[0] != 1: boundaries.insert(0, 1) boundaries.append(N + 1) ans = 0 roots = [1] * 60 current_h = 1 for i in range(len(boundaries) - 1): L = boundaries[i] R = boundaries[i + 1] - 1 if L in events: for k, x in events[L]: roots[k] = x current_h = 1 for k in range(3, 60): if roots[k] > 1: current_h = (current_h * roots[k]) % MOD sum_val = (F(R) - F(L - 1)) % MOD ans = (ans + current_h * sum_val) % MOD print(ans)