#include #include using namespace std; using namespace atcoder; using ll = long long; using mint = atcoder::modint998244353; #define rep(i,x,lim) for(ll i = (x);i < (ll)(lim);i++) // WA コード 2: down+1 の境界ミス mint nosimple_wa2(ll n){ mint ans=0; ll temp=n; for(ll i=1;i*i<=n;i++){ ll up=n/i; ll down=n/(i+1); // --- バグ: 本来 mint(i).pow(down+1) であるべきところが (down) 乗 --- mint a=mint(i).pow(down); // ------------------------------------------------------------- mint b=mint(i).pow(up-down); if(i==1) ans+=up-down; // i=1の時は a が使われないので N=4 などでWA else{ ans+=a*((b-1)/(i-1)); } temp=n/(i+1); } rep(i,1,temp+1){ ans+=mint(n/i).pow(i); } return ans; } int main(){ ll N; cin >> N; // N=4 (正解10) などでWA (答え8) cout << nosimple_wa2(N).val() << endl; }