#include #include using namespace std; using ll = long long; #define rep(i, s, t) for (ll i = s; i < (ll)(t); i++) #define all(x) begin(x), end(x) const int MOD = 998244353; template bool chmin(T& x, T y) { return x > y ? (x = y, true) : false; } template bool chmax(T& x, T y) { return x < y ? (x = y, true) : false; } struct io_setup { io_setup() { ios::sync_with_stdio(false); cin.tie(nullptr); cout << fixed << setprecision(15); } } io_setup; using mint = atcoder::modint998244353; mint greedy(ll x) { mint ans = 0; rep(i, 1, x + 1) { ans += mint(x / i).pow(i); } return ans; } template T modpow(T a, T b, T mod = 998244353) { T res = 1; while (b > 0) { if (b & 1) (res *= a) %= mod; (a *= a) %= mod; b >>= 1; } return res; } template T modinv(T n, T mod = 998244353) { n = (n % mod + mod) % mod; T m = mod, u = 1, v = 0; while (m) { long long t = n / m; n -= t * m; swap(n, m); u -= t * v; swap(u, v); } u %= mod; if (u < 0) u += mod; return u; } using lint = ll; ll rurun(ll n) { lint ans = 0; for (lint i = 1; i <= n; i++) { lint a = n / i; lint r = n / a; lint len = r - i + 1; if (a != 1) { ans += modpow(a % MOD, i) * (modpow(a % MOD, len) - 1 + MOD) % MOD * modinv((a + MOD - 1) % MOD) % MOD; ans %= MOD; } else ans += len; i = r; } return ans % MOD; } mint solve(ll x) { mint ans = 0; for (ll i = 1; i * i <= x; i++) { ans += mint(x / i).pow(i); } ll r = x + 1; for (ll d = 1; d < x / d; d++) { ll l = x / (d + 1) + 1; if (d == 1) ans += r - l; else { ans += mint(d).pow(l) * (mint(d).pow(r - l) - 1) / (mint(d) - 1); } r = l; } return ans; } int main() { ll n; cin >> n; // 998244354 // -> // 732007625 732007626 // cout << rurun(n) << ' ' << solve(n).val() << endl; cout << rurun(n) << endl; }