import sys from math import isqrt MOD = 998244353 def prefix_sqrt_weighted(n: int) -> int: if n <= 0: return 0 s = isqrt(n) m = s - 1 whole = (24 * m * m * m * m * m + 105 * m * m * m * m + 150 * m * m * m + 75 * m * m + 6 * m) // 60 left = s * s tail = s * (left + n) * (n - left + 1) // 2 return (whole + tail) % MOD def kth_root_floor(n: int, k: int) -> int: x = int(round(n ** (1.0 / k))) while pow(x + 1, k) <= n: x += 1 while pow(x, k) > n: x -= 1 return x def main() -> None: n = int(sys.stdin.readline()) if n < 8: print(prefix_sqrt_weighted(n)) return cube_lim = kth_root_floor(n, 3) inv = [0] * (cube_lim + 1) inv[1] = 1 for x in range(2, cube_lim + 1): inv[x] = MOD - (MOD // x) * inv[MOD % x] % MOD updates = {} k = 3 while (1 << k) <= n: lim = kth_root_floor(n, k) for x in range(2, lim + 1): value = pow(x, k) updates[value] = updates.get(value, 1) * x % MOD * inv[x - 1] % MOD k += 1 answer = 0 higher_part = 1 current_left = 1 last_prefix = 0 for point in sorted(updates): if current_left < point: now_prefix = prefix_sqrt_weighted(point - 1) answer = (answer + higher_part * (now_prefix - last_prefix)) % MOD last_prefix = now_prefix current_left = point higher_part = higher_part * updates[point] % MOD answer = (answer + higher_part * (prefix_sqrt_weighted(n) - last_prefix)) % MOD print(answer % MOD) if __name__ == "__main__": main()