#include using namespace std; const long long MOD = 998244353; //kurikaesi long long power(long long base, long long exp) { long long res = 1; base %= MOD; while (exp > 0) { if (exp % 2 == 1) res = res * base % MOD; base = base * base % MOD; exp /= 2; } return res; } long long sqrtt(long long x) { if (x == 0) return 0; long long r = sqrt(x); while ((__int128_t)(r + 1) * (r + 1) <= x) r++; while ((__int128_t)r * r > x) r--; return r; } long long F(long long n) { if (n == 0) return 0; long long m = sqrtt(n); long long k = (m - 1) % MOD; static long long inv2 = power(2, MOD - 2); static long long inv6 = power(6, MOD - 2); static long long inv30 = power(30, MOD - 2); long long S2 = k * (k + 1) % MOD * (2 * k + 1) % MOD * inv6 % MOD; long long S3 = k * (k + 1) % MOD * inv2 % MOD; S3 = S3 * S3 % MOD; long long poly = (3 * k % MOD * k % MOD + 3 * k % MOD - 1 + MOD) % MOD; long long S4 = k * (k + 1) % MOD * (2 * k + 1) % MOD * poly % MOD * inv30 % MOD; long long A = (2 * S4 % MOD + 3 * S3 % MOD + S2) % MOD; long long modm = m % MOD; long long modn = n % MOD; long long modd = modm * modm % MOD; long long S = (modn - modd + 1 + MOD) % MOD; long long avg = (modd + modn) % MOD; long long B = S * avg % MOD * inv2 % MOD * modm % MOD; return (A + B) % MOD; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); long long N; cin >> N; vector X; X.push_back(1); for (int k = 3; k <= 62; ++k) { for (long long y = 2; ; ++y) { __int128_t p = 1; bool ok = true; for (int i = 0; i < k; ++i) { p *= y; if (p > N) { ok = false; break; } } if (!ok) break; X.push_back((long long)p); } } X.push_back(N + 1); sort(X.begin(), X.end()); X.erase(unique(X.begin(), X.end()), X.end()); long long R_val[65]; for (int k = 3; k <= 62; ++k) R_val[k] = 1; long long ans = 0; for (size_t i = 0; i < X.size() - 1; ++i) { long long L = X[i]; long long R = X[i+1] - 1; if (L > R) continue; long long v3 = 1; for (int k = 3; k <= 62; ++k) { while (true) { __int128_t p = 1; bool ok = false; long long vall = R_val[k] + 1; for (int j = 0; j < k; ++j) { p *= vall; if (p > L) { ok = true; break; } } if (!ok) { R_val[k]++; } else { break; } } if (R_val[k] == 1) break; v3 = v3 * (R_val[k] % MOD) % MOD; } long long FF = (F(R) - F(L - 1) + MOD) % MOD; ans = (ans + v3 * FF % MOD) % MOD; } cout << ans << endl; return 0; }