#include using namespace std; using ll = long long; using ld = long double; using ull = unsigned long long; #define rep(i,n) for(ll i=0;i T div_floor(T a, T b) { return a / b - ((a ^ b) < 0 && a % b); } template T div_ceil(T a, T b) { return a / b + ((a ^ b) > 0 && a % b); } template inline bool chmin(T &x, U y) { return (y < x) ? (x = y, true) : false; } template inline bool chmax(T &x, U y) { return (x < y) ? (x = y, true) : false; } template ostream &operator<<(ostream &os, const vector &a){ if (a.empty()) return os; os << a.front(); for (auto e : a | views::drop(1)){ os << ' ' << e; } return os; } void dump(auto ...vs){ ((cout << vs << ' '), ...) << endl; } #include using namespace atcoder; using mint = modint998244353; ll isqrt(ll n){ assert(n>=0); ll s=sqrtl(n); while ((s+1)*(s+1)<=n)s++; while (s*s>n)s--; return s; } const ll INF=4e18; void solve() { vector sum_sqrt_cff={0,6,75,150,105,24}; rep(i,6){ sum_sqrt_cff[i]/=60; } ll N; cin>>N; auto sum_sqrt_2=[&](ll n)->mint { mint x=1; mint res=0; rep(i,6){ res+=sum_sqrt_cff[i]*x; x*=n; } return res; }; auto sum_sqrt=[&](ll n)->mint { ll sn=isqrt(n); mint res=sum_sqrt_2(sn-1); ll l=sn*sn; mint t=mint(n-l)*(n-1+l)/2; t*=sn; res+=t; return res; }; vector P; P.push_back(1); for (ll a=2;a<=1000010;a++){ ll p=a*a; for (ll d=3;d<62;d++){ if (p>INF/a)break; p*=a; P.push_back(p); } } sort(all(P)); P.erase(unique(all(P)),P.end()); ll S=P.size(); mint ans=0; vector now(61,1); rep(i,S-1){ ll l=P[i]; ll r=P[i+1]; for (ll a=3;a<61;a++){ if (intpow(now[a]+1,a)==l)now[a]++; } // dump(l); // dump(now); if (r>N){ mint t=sum_sqrt(N+1)-sum_sqrt(l); for (ll a=3;a<61;a++){ if (now[a]==1)break; t*=now[a]; } ans+=t; break; } else{ mint t=sum_sqrt(r)-sum_sqrt(l); for (ll a=3;a<61;a++){ if (now[a]==1)break; t*=now[a]; } ans+=t; } } cout<sync_with_stdio(0); ll T=1; while (T--){ solve(); } return 0; }