#include #include #include #include #include long long mod = 998244353; std::vector cnts, base; inline void update_cnts(const int& offset) { cnts[offset] ++; for (int i = offset; i >= 2; --i) { base[i] = base[i + 1] * cnts[i] % mod; } } long long umekomi[] = {0,872119937,184731056,536258375,456354121,550802483,73077724,91962779,207852605,918265207,29123438,906255998,396523343,886569066,424057750,981950439,94206159,45873866,873888377,552849124,993098840,400650089,743805257,352995645,608410085,719627934,56774200,747875179,8035792,820079823,94944489,512093040,648240604,501507482,558349918,92690251,127320633,263753506,804866913,958472276,564609841,987426557,223358902,749795443,12724417,724448882,817059102,352560524,960632598,71459147,995836333,81864437,530978342,429527426,938548310,706754321,154026105,648291121,11404346,276585524,651821256,892768857,908202394,806572817,95972266,924293584,710321492,292409656,390720978,748535055,432077968,633259931,611457227,106157729,208765272,485550660,535656405,676750021,882686785,902204241,641481866,251117764,243254134,797000068,134549313,959976222,778282973,326116959,22385712,24306820,494058901,848346992,249319915,587021300,221630052,241854233,145374972,117780790,388913189,749891425,529410216}; int main() { base = cnts = std::vector(62, 1); cnts[2] = -1; long long N; std::cin >> N; long long sN = std::sqrt(N); long long u_size = 10000000; long long u_i = sN / 10000000; long long s = u_i * u_size; long long l = (s - 1) * (s - 1); long long lm = l % mod; long long n = s * s; long long nm = n % mod; long long m, mm; long long ans = umekomi[u_i]; cnts[2] = s - 1; std::priority_queue< std::pair, std::vector>, std::greater> > que; for (long long p = 3; p < 61; ++p) { long long b = 2; while (true) { bool flag = true; long long b_p = b; for (long long q = 1; q < p; ++q) { if (N / b_p < b) { flag = false; break; } b_p *= b; } if (flag) { if (b_p >= n) { que.emplace(b_p, p); } else { cnts[p] ++; } } else break; b ++; } } for (int i = 60; i >= 2; --i) { base[i] = base[i + 1] * cnts[i] % mod; } /*long long t = 0; for (long long n = 1; n <= sN; ++n) { long long nm = n % mod; t += nm * nm % mod; if (t >= mod) t -= mod; } std::clog << t << '\n'; return 0;*/ while(s <= sN) { ans += nm * (nm - 1) / 2 % mod * base[2] % mod; ans -= lm * (lm - 1) / 2 % mod * base[2] % mod; if (ans < 0) ans += mod; else if (ans >= mod) ans -= mod; l = n; lm = nm; update_cnts(2); while (!que.empty() && que.top().first == n) { update_cnts(que.top().second); que.pop(); } s ++; n = s * s; nm = n % mod; while (!que.empty() && que.top().first < n) { m = que.top().first; mm = m % mod; ans += mm * (mm - 1) / 2 % mod * base[2] % mod; ans -= lm * (lm - 1) / 2 % mod * base[2] % mod; if (ans < 0) ans += mod; else if (ans >= mod) ans -= mod; l = n; lm = nm; while (!que.empty() && que.top().first == m) { update_cnts(que.top().second); que.pop(); } } } long long Nm = N % mod; ans += (Nm + 1) * Nm / 2 % mod * base[2] % mod; ans -= lm * (lm - 1) / 2 % mod * base[2] % mod; if (ans < 0) ans += mod; else if (ans >= mod) ans -= mod; std::cout << ans << std::endl; }