#include <bits/stdc++.h>
using namespace std;
const long long MOD = 998244353;
long long finv(long long x) {
long long p = MOD - 2;
long long inv = 1;
while (p) {
if (p & 1) inv = inv * x % MOD;
x = x * x % MOD;
p >>= 1;
}
return inv;
}
int main() {
const int lim = 2 * 100000;
vector<long long> inv(lim + 1, 1);
for (int i = 2; i <= lim; i++) inv[i] = finv(i);
int t;
cin >> t;
while (t) {
t--;
int n;
cin >> n;
vector<int> cnt(35);
for (int x = 1; x <= n; x++) {
int bits = 0, y = x;
while (y) {
bits++;
y >>= 1;
}
cnt[bits]++;
}
vector<vector<long long>> combs(35, vector<long long>(1, 1));
for (int b = 0; b < 35; b++) {
int mx = cnt[b];
long long ncr = 1, cur = 1;
for (int k = 1; k <= mx; k++) {
ncr = (mx - k + 1) * ncr % MOD;
ncr = inv[k] * ncr % MOD;
cur = (cur + ncr) % MOD;
combs[b].push_back(cur);
}
}
long long ans = 0;
for (int b = 0; b < 35; b++) {
int mx = cnt[b];
for (int v = 1; v <= mx; v++) {
long long c = (combs[b][v] - combs[b][v - 1] + MOD) % MOD;
for (int bb = 0; bb < 35; bb++) {
if (bb == b) continue;
if (bb < b) c *= combs[bb][min(cnt[bb], v - 1)];
else c *= combs[bb][min(cnt[bb], v)];
c %= MOD;
}
ans += c * v;
ans %= MOD;
}
}
cout << ans << '\n';
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBsb25nIGxvbmcgTU9EID0gOTk4MjQ0MzUzOwoKbG9uZyBsb25nIGZpbnYobG9uZyBsb25nIHgpIHsKICAgIGxvbmcgbG9uZyBwID0gTU9EIC0gMjsKICAgIGxvbmcgbG9uZyBpbnYgPSAxOwogICAgd2hpbGUgKHApIHsKICAgICAgICBpZiAocCAmIDEpIGludiA9IGludiAqIHggJSBNT0Q7CiAgICAgICAgeCA9IHggKiB4ICUgTU9EOwogICAgICAgIHAgPj49IDE7CiAgICB9CiAgICByZXR1cm4gaW52Owp9CgppbnQgbWFpbigpIHsKICAgIGNvbnN0IGludCBsaW0gPSAyICogMTAwMDAwOwogICAgdmVjdG9yPGxvbmcgbG9uZz4gaW52KGxpbSArIDEsIDEpOwogICAgZm9yIChpbnQgaSA9IDI7IGkgPD0gbGltOyBpKyspIGludltpXSA9IGZpbnYoaSk7CgogICAgaW50IHQ7CiAgICBjaW4gPj4gdDsKICAgIHdoaWxlICh0KSB7CiAgICAgICAgdC0tOwogICAgICAgIGludCBuOwogICAgICAgIGNpbiA+PiBuOwogICAgICAgIHZlY3RvcjxpbnQ+IGNudCgzNSk7CiAgICAgICAgZm9yIChpbnQgeCA9IDE7IHggPD0gbjsgeCsrKSB7CiAgICAgICAgICAgIGludCBiaXRzID0gMCwgeSA9IHg7CiAgICAgICAgICAgIHdoaWxlICh5KSB7CiAgICAgICAgICAgICAgICBiaXRzKys7CiAgICAgICAgICAgICAgICB5ID4+PSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNudFtiaXRzXSsrOwogICAgICAgIH0KCiAgICAgICAgdmVjdG9yPHZlY3Rvcjxsb25nIGxvbmc+PiBjb21icygzNSwgdmVjdG9yPGxvbmcgbG9uZz4oMSwgMSkpOwogICAgICAgIGZvciAoaW50IGIgPSAwOyBiIDwgMzU7IGIrKykgewogICAgICAgICAgICBpbnQgbXggPSBjbnRbYl07CiAgICAgICAgICAgIGxvbmcgbG9uZyBuY3IgPSAxLCBjdXIgPSAxOwogICAgICAgICAgICBmb3IgKGludCBrID0gMTsgayA8PSBteDsgaysrKSB7CiAgICAgICAgICAgICAgICBuY3IgPSAobXggLSBrICsgMSkgKiBuY3IgJSBNT0Q7CiAgICAgICAgICAgICAgICBuY3IgPSBpbnZba10gKiBuY3IgJSBNT0Q7CiAgICAgICAgICAgICAgICBjdXIgPSAoY3VyICsgbmNyKSAlIE1PRDsKICAgICAgICAgICAgICAgIGNvbWJzW2JdLnB1c2hfYmFjayhjdXIpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBsb25nIGxvbmcgYW5zID0gMDsKICAgICAgICBmb3IgKGludCBiID0gMDsgYiA8IDM1OyBiKyspIHsKICAgICAgICAgICAgaW50IG14ID0gY250W2JdOwogICAgICAgICAgICBmb3IgKGludCB2ID0gMTsgdiA8PSBteDsgdisrKSB7CiAgICAgICAgICAgICAgICBsb25nIGxvbmcgYyA9IChjb21ic1tiXVt2XSAtIGNvbWJzW2JdW3YgLSAxXSArIE1PRCkgJSBNT0Q7CiAgICAgICAgICAgICAgICBmb3IgKGludCBiYiA9IDA7IGJiIDwgMzU7IGJiKyspIHsKICAgICAgICAgICAgICAgICAgICBpZiAoYmIgPT0gYikgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgaWYgKGJiIDwgYikgYyAqPSBjb21ic1tiYl1bbWluKGNudFtiYl0sIHYgLSAxKV07CiAgICAgICAgICAgICAgICAgICAgZWxzZSBjICo9IGNvbWJzW2JiXVttaW4oY250W2JiXSwgdildOwogICAgICAgICAgICAgICAgICAgIGMgJT0gTU9EOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYW5zICs9IGMgKiB2OwogICAgICAgICAgICAgICAgYW5zICU9IE1PRDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjb3V0IDw8IGFucyA8PCAnXG4nOwogICAgfQogICAgcmV0dXJuIDA7Cn0K