#include using namespace std; typedef __int128_t int128; const long long MOD = 998244353; long long sum_range(long long l, long long r) { if (l > r) return 0; int128 L = l, R = r; int128 count = (R - L + 1); int128 res = (L + R) * count / 2; return (long long)(res % MOD); } int main() { long long N; cin >> N; set X; X.insert(1); X.insert(N + 1); for (int k = 2; k <= 60; ++k) { for (long long v = 2; ; ++v) { int128 val = 1; bool ok = true; for (int p = 0; p < k; ++p) { if (__builtin_mul_overflow(val, v, &val)) { ok = false; break; } } if (!ok || val > N) break; X.insert((long long)val); } } vector X1(X.begin(), X.end()); long long tot = 0; for (size_t i = 0; i < X1.size() - 1; ++i) { long long L = X1[i]; long long R = X1[i+1] - 1; long long ans = 1; for (int k = 2; k <= 60; ++k) { long long v = pow(L, 1.0/k); while (true) { int128 tmp = 1; bool ok = true; for(int p=0; p 1) { int128 tmp = 1; for(int p=0; p L) v--; else break; } if (v <= 1) break; ans = (ans * (v % MOD)) % MOD; } long long s = sum_range(L, R); long long term = (s * ans) % MOD; tot = (tot + term) % MOD; } cout << (long long)tot << endl; return 0; }