#include #include using namespace std; using namespace atcoder; typedef modint998244353 mint; #define rep(i, n) for (int i = 0; i < (int)(n); i++) #define rrep(i, n) for (int i = 1; i <= (int)(n); i++) #define ll long long istream& operator>>(istream& is,mint& m) { long long val; is>>val; m=val; return is; } vector PTS(vector P,mint c){ int n=P.size()-1; vector fact(n+1); vector invfact(n+1); vector cc(n+1); fact[0]=1; invfact[0]=1; cc[0]=1; rrep(i,n){ fact[i]=fact[i-1]*i; cc[i]=cc[i-1]*c; } invfact[n]=fact[n].inv(); for(int i=n-1;i>=1;i--) invfact[i]=invfact[i+1]*(i+1); vector X1(n+1); vector X2(n+1); rep(i,n+1){ X1[i]=P[n-i]*fact[n-i]; X2[i]=cc[i]*invfact[i]; } vector X=convolution(X1,X2); vector ans(n+1); rep(i,n+1){ ans[i]=X[n-i]*invfact[i]; } return ans; } vector inv(const vector& f, int n) { assert(n > 0); assert(f.size() > 0 && f[0].val() != 0); vector H(1); H[0] = f[0].inv(); int k = 1; while (k < n) { int k2 = k * 2; vector f_k(f.begin(), f.begin() + min((int)f.size(), k2)); if (f_k.size() < k2) f_k.resize(k2, 0); vector H_k = H; H_k.resize(k2, 0); vector fH = convolution(f_k, H_k); vector T(k2); for(int i = 0; i < k2; i++) { T[i] = -fH[i]; } T[0] += 2; H.resize(k2, 0); H = convolution(H, T); H.resize(k2); k = k2; } H.resize(n); return H; } int C=400009; vector fact(C+1),invfact(C+1); mint binom(int n,int r){ if (r>n) return 0; else{ return fact[n]*invfact[r]*invfact[n-r]; } } int main(){ fact[0]=1; invfact[0]=1; rrep(i,C) fact[i]=fact[i-1]*i; invfact[C]=fact[C].inv(); for(int i=C-1;i>=1;i--) invfact[i]=invfact[i+1]*(i+1); ll n; cin>>n; mint ans=0; for(ll l=1;l<=n;){ ll i=n/l; if(i==0) break; ll r=n/i; mint j=mint(i); mint s=0; if(j.val()==1) s=r-l+1; else{ s=j.pow(l)*(j.pow(r-l+1)-1)*(j-1).inv(); } ans+=s; l=r+1; } cout<