#include #include #include #include #include using namespace std; long long isqrt(long long x) { long long res = sqrt(x); while ((res + 1) * (res + 1) <= x) ++res; while (res * res > x) --res; return res; } long long solve(long long n) { const long long inf1 = 1000000000000000000LL, inf2 = 1000000000000000001LL; const int mod = 998244353, b = 1e6; vector inv(b + 1); inv[1] = 1; for (int i = 2; i <= b; ++i) inv[i] = mod - (mod / i) * inv[mod % i] % mod; auto cal = [&](long long x) -> long long { long long iq = isqrt(x) - 1; iq %= mod; x %= mod; long long ret = inv[20] * iq % mod * (iq + 1) % mod * (iq + 2) % mod * ((8LL * iq % mod * iq % mod + 11LL * iq % mod + 1) % mod) % mod; long long ls = x * (x + 1) % mod * inv[2] % mod; long long lv = (iq + 1LL) * (iq + 1LL) % mod; ls -= lv * (lv - 1 + mod) % mod * inv[2] % mod; ls = (ls % mod + mod) % mod; ls = ls * (iq + 1) % mod; ret = (ret + ls) % mod; return ret; }; auto pow = [&](long long a, int k) -> long long { long long ret = 1; while (k--) { if (ret > (n + 1) / a) return n + 1; ret *= a; } return ret; }; vector> all; for (int i = 3; i <= 60; ++i) { for (int j = 2; j <= b; ++j) { long long tmp = pow(j, i); if (tmp > n) break; all.push_back({tmp, j}); } } sort(all.begin(), all.end()); long long bs = 1, ans = 0, now = 0; int siz = all.size(); for (int l = 0, r = 0; l < siz; l = r) { long long tmp = (cal(all[l].first - 1) - cal(now) + mod) % mod; ans = (ans + bs * tmp % mod) % mod; while (r < siz && all[r].first == all[l].first) { bs = bs * inv[all[r].second - 1] % mod * all[r].second % mod; ++r; } now = all[l].first - 1; } long long tmp = (cal(n) - cal(now) + mod) % mod; ans = (ans + bs * tmp % mod) % mod; return ans; } long long naive(long long n) { const int mod = 998244353, b = 1e6; vector val(n + 1); for (int i = 1; i <= n; ++i) val[i] = i; auto pow = [&](long long a, int k) -> long long { long long ret = 1; while (k--) { if (ret > (n + 1) / a) return n + 1; ret *= a; } return ret; }; for (int i = 2; i <= 60; ++i) { for (int j = 1; j <= b; ++j) { long long tmpl = pow(j, i), tmpr = pow(j + 1, i); if (tmpl > n) break; for (int k = tmpl; k < tmpr; ++k) val[k] = val[k] * j % mod; } } long long ans = 0; for (int i = 1; i <= n; ++i) ans = (ans + val[i]) % mod; return ans; } int main() { long long n; cin >> n; cout << solve(n) << endl; }