// https://atcoder.jp/contests/abc230/submissions/60477016 #include #include using namespace std; #define rep(i, a, b) for (int i = (int)(a); i < (int)(b); i++) #define rrep(i, a, b) for (int i = (int)(b) - 1; i >= (int)(a); i--) using ll = int64_t; using i128 = __int128_t; using mint = atcoder::modint998244353; mint solve(ll n) { const mint two_inv = mint(2).inv(); ll SQ = sqrtl(n), CB = cbrtl(n); ll x = n / SQ, y = SQ + 1; mint ret = 0; using P = pair; stack

sbt({{1, 0}, {1, 1}}); auto inside = [&](ll x, ll y) { return y != 0 && x > n / y; }; auto cut = [&](ll x, P p) { return i128(n) * p.first <= i128(x) * x * p.second; }; for (;;) { auto [dx1, dy1] = sbt.top(); sbt.pop(); while (inside(x + dx1, y - dy1)) { ret += x * (mint)dy1 + (dy1 + 1) * (mint)(dx1 - 1) * two_inv; x += dx1, y -= dy1; } if (y <= CB) break; ll dx2 = dx1, dy2 = dy1; while (!sbt.empty()) { tie(dx1, dy1) = sbt.top(); if (inside(x + dx1, y - dy1)) break; sbt.pop(); dx2 = dx1, dy2 = dy1; } if (sbt.empty()) break; for (;;) { ll mx = dx1 + dx2, my = dy1 + dy2; if (inside(x + mx, y - my)) { sbt.push({dx1 = mx, dy1 = my}); } else { if (cut(x + mx, P{dx1, dy1})) break; dx2 = mx, dy2 = my; } } } rep(i, 1, y) ret += n / i; ret = ret * 2 - SQ * SQ; return ret; } int main() { int t; cin >> t; while (t--) { long n; cin >> n; n = 2 * n + 1; mint ans = solve(n) - 2 * solve(n / 2) + solve(n / 4) - n; cout << ans.val() << endl; } }