#include #include using namespace std; using isize = size_t; using i32 = int; using u32 = unsigned int; using i64 = long long; using u64 = unsigned long long; using i128 = __int128_t; using u128 = __uint128_t; using f64 = long double; using p2 = pair; using el = tuple; using mint = atcoder::modint998244353; void _main(); int main() { cin.tie(0); ios::sync_with_stdio(false); cout << fixed << setprecision(18); _main(); } mint solve(i64 r, mint x) { if (r == 0) return 1; i64 mid = r / 2; if (r % 2 == 0) return solve(r - 1, x) * x + 1; mint res = solve(r / 2, x); return res + res * x.pow(r / 2 + 1); } void _main() { i64 n; cin >> n; i64 m = -1; mint ans = 0; for (i64 i = 1; n / i >= i; i++) { ans += mint(n / i).pow(i); m = i; } for (i64 i = 1; i <= 5000000; i++) { // n / j <= i // n / i <= j i64 r = n / i; i64 l = n / (i + 1); l = max(l, m); if (l >= r) continue; ans += solve(r, i); ans -= solve(l, i); } cout << ans.val() << "\n"; }