#include #include #include #include using namespace std; typedef __int128_t int128; const long long MOD = 998244353; long long safe_pow(long long x, int k, long long N) { int128 res = 1; for (int i = 0; i < k; ++i) { res *= x; if (res > N) return N + 1; } return (long long)res; } long long get_root(long long n, int k) { if (k == 1) return n; long long r = pow(n, 1.0 / k); while (safe_pow(r + 1, k, n) <= n) r++; while (safe_pow(r, k, n) > n) r--; return r; } int main() { long long N; if (!(cin >> N)) return 0; vector points; points.push_back(1); points.push_back(N + 1); for (int k = 2; k <= 60; ++k) { for (long long m = 1; ; ++m) { long long val = safe_pow(m, k, N); if (val > N) break; points.push_back(val); } } sort(points.begin(), points.end()); points.erase(unique(points.begin(), points.end()), points.end()); long long ans = 0; for (size_t i = 0; i + 1 < points.size(); ++i) { long long L = points[i]; long long R = points[i + 1] - 1; long long prod = 1; for (int k = 2; k <= 60; ++k) { long long r = get_root(L, k); if (r < 2) break; prod = (prod * (r % MOD)) % MOD; } int128 count = (R - L + 1); int128 sum_i = (int128)(L + R) * count / 2; long long term = (long long)((sum_i % MOD) * prod % MOD); ans = (ans + term) % MOD; } cout << ans << endl; return 0; }