#ifndef ELSIE_LOCAL_H #define ELSIE_LOCAL_H #ifndef ELSIE_MISC_HEADER #define ELSIE_MISC_HEADER #if __has_include() #include "atcoder/modint" using namespace atcoder; using mint=modint998244353; using mint1=modint1000000007; #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; using namespace chrono; using std::cin; using std::cout; using sstream=stringstream; #endif #ifndef ELSIE_MISC_DEFINE #define ELSIE_MISC_DEFINE #define RET return #define fi first #define se second #define endl '\n' #define sn(i,c) " \n"[i==c] #define rsv(n) reserve(n) #define pf(a) push_front(a) #define pb(a) push_back(a) #define eb(...) emplace_back(__VA_ARGS__) #define ppf() pop_front() #define ppb() pop_back() #define pp() pop() #define ins(a) insert(a) #define emp(...) emplace(__VA_ARGS__) #define ers(a) erase(a) #define cont(a) contains(a) #define mp(f,s) make_pair(f,s) #define A(a) begin(a),end(a) #define I(a,i) begin(a),begin(a)+(i) #define _SEL4(_1,_2,_3,_4,name,...) name #define _SEL3(_1,_2,_3,name,...) name #define _REP4(i,s,n,st) for(long i=(s);i<(n);i+=(st)) #define _REP3(i,s,n) _REP4(i,s,n,1) #define _REP2(i,n) _REP3(i,0,n) #define _REP1(n) _REP2(_,n) #define _RREP4(i,n,t,s) for(long i=(n);i>=(t);i-=(s)) #define _RREP3(i,n,t) _RREP4(i,n,t,1) #define _RREP2(i,n) _RREP3(i,n,0) #define _ITER2(x,a) for(auto&&x:a) #define _ITER3(x,y,a) for(auto&&[x,y]:a) #define _CTER2(x,a) for(const auto&x:a) #define _CTER3(x,y,a) for(const auto&[x,y]:a) #define rep(...) _SEL4(__VA_ARGS__,_REP4,_REP3,_REP2,_REP1)(__VA_ARGS__) #define rrep(...) _SEL4(__VA_ARGS__,_RREP4,_RREP3,_RREP2,_REP1)(__VA_ARGS__) #define iter(...) _SEL3(__VA_ARGS__,_ITER3,_ITER2)(__VA_ARGS__) #define cter(...) _SEL3(__VA_ARGS__,_CTER3,_CTER2)(__VA_ARGS__) #endif #ifndef ELSIE_MISC_CONST #define ELSIE_MISC_CONST #define NL cout<<'\n' #define npi numbers::pi constexpr int64_t inf=1ll<<60,minf=-inf; constexpr int32_t inf32=1ll<<30,minf32=-inf32; constexpr char sep='\n'; constexpr array,8>dc={{{1,0},{0,1},{-1,0},{0,-1},{1,1},{1,-1},{-1,1},{-1,-1}}}; #define yes cout<<"Yes\n" #define no cout<<"No\n" #define yn(c) (c)?yes:no #endif #if __cplusplus > 202002L #ifndef ELSIE_MISC_FUNC #define ELSIE_MISC_FUNC namespace vies=std::views; #define DR(i) views::drop(i) #define TK(i) views::take(i) #define RV views::reverse #define IOTA vies::iota #define rev(a) reverse(A(a)) #define minel(a) min_element(A(a)) #define maxel(a) max_element(A(a)) #define acm(a) accumulate(A(a),0ll) #define nxpm(a) next_permutation(A(a)) #define Sort(a) sort(A(a)) #define uni(a) Sort(a);a.erase(unique(A(a)),a.end()) #define swapcase(a) a=(isalpha(a)?a^32:a) templateinline void chmax(T&a,const U&b){if(ainline void chmin(T&a,const U&b){if(a>b)a=b;} #define _BISECT4(_1,_2,_3,_4,name,...) name #define _LB_BEX(b,e,x) lower_bound(b,e,x) #define _LB_BEXG(b,e,x,g) lower_bound(b,e,x,g) #define _UB_BEX(b,e,x) upper_bound(b,e,x) #define _UB_BEXG(b,e,x,g) upper_bound(b,e,x,g) #define lb(...) _BISECT4(__VA_ARGS__,_LB_BEXG,_LB_BEX)(__VA_ARGS__) #define ub(...) _BISECT4(__VA_ARGS__,_UB_BEXG,_UB_BEX)(__VA_ARGS__) #define TP template> templateconcept LUBI= same_as>||same_as>||is_array_v; #define RL requires LUBI TP size_t lbi(const T&v,const U&x,cp cmp=cp())RL{RET lb(A(v),x,cmp)-begin(v);} TP size_t ubi(const T&v,const U&x,cp cmp=cp())RL{RET ub(A(v),x,cmp)-begin(v);} TP size_t lbi(size_t i,const T&v,const U&x,cp cmp=cp())RL{RET lb(i+A(v),x,cmp)-begin(v);} TP size_t ubi(size_t i,const T&v,const U&x,cp cmp=cp())RL{RET ub(i+A(v),x,cmp)-begin(v);} TP size_t lbi(const T&v,size_t i,const U&x,cp cmp=cp())RL{RET lb(I(v,i),x,cmp)-begin(v);} TP size_t ubi(const T&v,size_t i,const U&x,cp cmp=cp())RL{RET ub(I(v,i),x,cmp)-begin(v);} TP size_t lbi(size_t i,const T&v,size_t e,const U&x,cp cmp=cp())RL{RET lb(i+I(v,e),x,cmp)-begin(v);} TP size_t ubi(size_t i,const T&v,size_t e,const U&x,cp cmp=cp())RL{RET ub(i+I(v,e),x,cmp)-begin(v);} #undef TP #undef RL #define TP template #define MT make_unsigned_t TP constexpr int32_t pcnt(T p){return popcount(MT(p));} TP constexpr int32_t lsb(T p){return countr_zero(MT(p));} TP constexpr int32_t msb(T p){return sizeof(T)*8-1-countl_zero(MT(p));} template void putbit(T s){ char buf[N+1]={0}; for(char*itr=buf+N-1;itr>=buf;itr--,s>>=1) *itr='0'+(s&1); cout<concept Lint=same_as||same_as; templateconcept Itrabl=requires(const T&x){x.begin();x.end();}&&!std::is_same_v; templateconcept IItrabl=Itrabl&&Itrabl; templateconcept ModInt=requires(const T&x){x.val();}; templateconcept NLobj=Itrabl||std::is_same_v; istream&operator<<(istream&is,__float128&x){double y;is>>y;x=y;return is;} ostream&operator<<(ostream&os,const __float128&x){return os<(x);} templateostream&operator<<(ostream&dst,T val){ ostream::sentry s(dst); if(!s)return dst; char _O128[64]; char*d=end(_O128); bool vsign=val<0; __uint128_t v=val; if(vsign&&val!=numeric_limits::min())v=1+~(__uint128_t)val; do{ *(--d)="0123456789"[v%10]; v/=10; }while(v!=0); if(vsign)*(--d)='-'; ptrdiff_t len=end(_O128)-d; if(dst.rdbuf()->sputn(d,len)!=len)dst.setstate(ios_base::badbit); return dst; } templateistream&operator>>(istream&src,T&val) { string s;src>>s; bool is_neg=numeric_limits::is_signed&&s.size()>0&&s[0]=='-'; for(val=0;const auto&x:s|views::drop(is_neg))val=10*val+x-'0'; if(is_neg)val*=-1; return src; } templateistream&operator>>(istream&is,T&v){int64_t x;is>>x;v=x;return is;} templateistream&operator>>(istream&is,pair&v){return is>>v.first>>v.second;} templateistream&operator>>(istream&is,T&v){for(auto&&x:v)is>>x;return is;} templatevoid in(T&a){cin>>a;} templatevoid in(T&a,Ts&... b){in(a);in(b...);} templatevector>zip(size_t n,size_t m){ vector>r(min(n,m)); iter(x,y,r)in(x); iter(x,y,r)in(y); return move(r); } templatevector>zip(size_t n){return move(zip(n,n));} templateostream&operator<<(ostream&os,const T&v){return os<ostream&operator<<(ostream&os,const pair&v){return os<<'('<ostream&operator<<(ostream&os,const T&v){size_t cnt=0;cter(x,v)os<ostream&operator<<(ostream&os,const T&v){size_t cnt=0;cter(x,v)os<void _out(const T&a){if(OFLG)(*dos)<<"0 \n"[OFLG]<void _out(const T&a){(*dos)<<(OFLG?"\n":"")<void _out(const T&a,const Ts&... b){_out(a);_out(b...);} templatevoid out(const Ts&... v){OFLG=0;_out(v...);(*dos)<using vc=vector; templateusing vv=vc>; templateusing v3=vv>; templateusing v4=vv>; templateusing gr=greater; templateusing pq=priority_queue; templateusing pqg=priority_queue, gr>; #define uset unordered_set #define umap unordered_map using it=int32_t; using i8=int8_t; using u8=uint8_t; using i16=int16_t; using u16=uint16_t; using i32=int32_t; using u32=uint32_t; using i64=int64_t; using u64=uint64_t; using i128=__int128_t; using u128=__uint128_t; using intw=__int128_t; using uintw=__uint128_t; using f32=float; using f64=double; using f128=__float128; using vi=vc; using vit=vc; using vb=vc; using pi=pair; using pit=pair; using str=string; using vs=vc; using pqgp=pqg; #define int i64 #define itn i64 #define LL long long #endif mint quotients(uint64_t n){ using u64=uint64_t; mint ret=0; for(int x=n;x>0;){ u64 q=n/x; u64 nx=n/(q+1); ret+=q*(x-nx); x=nx; } return ret; } void slv(){ INT(n); mint ans=0; rep(i,1,n+1) ans+=(quotients(i)); out(ans); } signed main(){ cin.tie(0)->sync_with_stdio(0); cout<