#include using namespace std; typedef __int128_t i128; long long M = 998244353; long long sr(long long l, long long r) { if (l > r) return 0; return (long long)(((i128)l + r) * (r - l + 1) / 2 % M); } int main() { long long N; cin >> N; set E = {1, N + 1}; for (int k = 3; k <= 60; ++k) { for (long long v = 2; ; ++v) { i128 x = 1; for (int p = 0; p < k; ++p) { if (__builtin_mul_overflow(x, v, &x)) { x = N + 1; break; } } if (x > N) break; E.insert((long long)x); } } vector P(E.begin(), E.end()); long long ans = 0; for (int i = 0; i < P.size() - 1; ++i) { long long L = P[i], R = P[i+1] - 1, k3 = 1; for (int k = 3; k <= 60; ++k) { long long v = pow(L, 1.0/k); while (true) { i128 x = 1; bool o = 0; for(int p=0; p 1) { i128 x = 1; for(int p=0; p L) v--; else break; } if (v <= 1) break; k3 = k3 * (v % M) % M; } for (long long c = L, n, v2; c <= R; c = n + 1) { v2 = sqrt(c); while ((v2 + 1) * (v2 + 1) <= c) v2++; while (v2 * v2 > c) v2--; n = min(R, (v2 + 1) * (v2 + 1) - 1); ans = (ans + sr(c, n) * (v2 % M) % M * k3) % M; } } cout << ans << endl; }