#include using namespace std; typedef __int128_t int128; const long long MOD = 998244353; long long sum(long long l, long long r) { if (l > r) return 0; int128 first = l; int128 last = r; int128 num = (r - l + 1); int128 res = (first + last) * num / 2; return (long long)(res % MOD); } int main() { long long N; cin >> N; map mp; mp[1] = 1; for (int k = 3; k <= 60; ++k) { for (long long v = 2; ; ++v) { int128 val = 1; bool ok = false; for (int p = 0; p < k; ++p) { if (__builtin_mul_overflow(val, v, &val)) { ok = true; break; } } if (ok || val > N) break; mp[(long long)val] = 1; } } for (long long v = 1; v * v <= N; ++v) { mp[v * v] = 1; } vector pos; for (auto const& [p, _] : mp) pos.push_back(p); pos.push_back(N + 1); long long tot = 0; for (size_t i = 0; i < pos.size() - 1; ++i) { long long L = pos[i]; long long R = pos[i+1] - 1; if (L > N) break; long long X = 1; long long s2 = sqrt(L); while ((s2 + 1) * (s2 + 1) <= L) s2++; while (s2 * s2 > L) s2--; X = (X * (s2 % MOD)) % MOD; for (int k = 3; k <= 40; ++k) { long long sk = pow(L, 1.0 / k); while (true) { int128 cur = 1; for(int p=0; p 1) { int128 cur = 1; for(int p=0; p L) sk--; else break; } if (sk <= 1) break; X = (X * (sk % MOD)) % MOD; } long long r_sum = sum(L, R); long long term = (r_sum * X) % MOD; tot = (tot + term) % MOD; } cout << (long long)tot << endl; return 0; }