#include #include #include #include #include #include using namespace std; using namespace atcoder; using mint = modint998244353; typedef long long ll; int main(){ ll i,n; cin >> n; mint ans = 0; vector,ll>> v; { ll val = n; while(val){ ll le = n/(val + 1),ri = n/val; v.push_back({{le,ri},val}); val = n/(ri + 1); } } vector sum; sum.push_back(0); for(i=0;i mint{ if(x==0) return 0LL; pair,ll> p = {{x,-1},-1}; ll id = lower_bound(v.begin(),v.end(),p) - v.begin(); mint a = sum[id]; mint b = v[id - 1].second*((mint)v[id - 1].first.second - (mint)x); return a - b; }; // sum_i in (l,r] n/i auto g = [&](ll l,ll r){ return f(r) - f(l); }; // ll le = 1,ri = n; ll le = max(1LL,n - (ll)sqrtl(n) - 10LL),ri = n; vector v_val(ri - le + 1); for(ll i=le;i<=ri;i++) v_val[i - le] = i; vector>> fa(ri - le + 1); for(i=2;i*i<=n;i++){ ll l = (le + i - 1)/i*i; for(ll j = l - le;j divs; auto dfs = [&](auto &&self,ll x,int id,int len){ if(len==fa[id].size()){ divs.push_back(x); return; } for(int y=0;y<=fa[id][len].second;y++){ self(self,x,id,len + 1); // assert((id + le)%fa[id][len].first==0); x *= fa[id][len].first; } }; for(i=0;i1) fa[i].push_back({v_val[i],1}); } set s; for(ll c=1;c*c<=n;c++){ ll cn = max(0LL,(n/c - 1 - c)); mint sum = (-c + 1)*cn; if(cn) sum += g(c,n/c - 1); // for(ll b=c + 1;b<=n/c - 1;b++){ // if(n%bxなので(n - x)の約数列挙をする (最初に列挙) if(n - (c - 1) - le>=0){ divs.clear(); dfs(dfs,1LL,(n - (c - 1) - le),0); // cout << divs.size() << " " << n - (c - 1) << endl; // for(ll x:divs) cout << x << " "; // cout << "\n"; for(ll d:divs){ // assert((n - (c - 1))%d==0); if(c + 1<=d && d=n/c){ s.erase(*s.rbegin()); } sum -= s.size(); ans += c*sum; } cout << ans.val() << "\n"; }