#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 (RE) コード 1: i=1 のエッジケース忘れ mint nosimple_wa1(ll n){ mint ans=0; ll temp=n; // ループ上限保持 (infである必要はない) for(ll i=1;i*i<=n;i++){ ll up=n/i; ll down=n/(i+1); mint a=mint(i).pow(down+1); mint b=mint(i).pow(up-down); // --- バグ: i=1 の場合分けを忘れている --- // if(i==1) ans+=up-down; // else{ // i=1 のとき (i-1) が 0 になり、RE (ゼロ除算) が発生する 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 >= 2 の場合、i=1 のループでRE cout << nosimple_wa1(N).val() << endl; }