#include using namespace std; using int64 = long long; const int64 MOD = 998244353; const int64 INV2 = (MOD + 1) / 2; int64 addmod(int64 a, int64 b) { int64 s = a + b; if (s >= MOD) s -= MOD; return s; } int64 mulmod(int64 a, int64 b) { return (__int128)a * b % MOD; } int64 iroot_floor(int64 n, int k) { int64 lo = 0, hi = n + 1; while (lo + 1 < hi) { int64 mid = lo + (hi - lo) / 2; __int128 p = 1; bool ok = true; for (int t = 0; t < k; ++t) { p *= mid; if (p > n) { ok = false; break; } } if (ok) lo = mid; else hi = mid; } return lo; } /* min(N, (j+1)^k - 1) given j = floor(i^{1/k}); cap so power never wraps */ int64 end_from_j(int64 j, int k, int64 N) { __int128 b = (__int128)(j + 1); __int128 pk = 1; for (int t = 0; t < k; ++t) { pk *= b; if (pk > (__int128)N) return N; } int64 end = (int64_t)(pk - 1); return end > N ? N : end; } int64 tri_mod(int64 n) { if (n <= 0) return 0; return mulmod(mulmod(n % MOD, (n + 1) % MOD), INV2); } int64 sum_i_mod(int64 L, int64 R) { if (L > R) return 0; return (tri_mod(R) - tri_mod(L - 1) + MOD) % MOD; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int64 N; cin >> N; int64 ans = 0; for (int64 i = 1; i <= N;) { int64 R = N; int64 g = 1; for (int k = 2; k <= 60; ++k) { int64 j = iroot_floor(i, k); int64 e = end_from_j(j, k, N); if (e < R) R = e; if (j >= 2) g = mulmod(g, j % MOD); } if (R < i) R = i; ans = addmod(ans, mulmod(g, sum_i_mod(i, R))); i = R + 1; } cout << ans << '\n'; return 0; }