#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 = 200000;
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(20);
for (int x = 1; x <= n; x++) {
int bits = 32 - __builtin_clz(x);
cnt[bits]++;
}
vector<vector<long long>> combs(20, vector<long long>(1, 1));
for (int b = 0; b < 20; 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 < 20; 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 < 20; 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+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBsb25nIGxvbmcgTU9EID0gOTk4MjQ0MzUzOwoKbG9uZyBsb25nIGZpbnYobG9uZyBsb25nIHgpIHsKICAgIGxvbmcgbG9uZyBwID0gTU9EIC0gMjsKICAgIGxvbmcgbG9uZyBpbnYgPSAxOwogICAgd2hpbGUgKHApIHsKICAgICAgICBpZiAocCAmIDEpIGludiA9IGludiAqIHggJSBNT0Q7CiAgICAgICAgeCA9IHggKiB4ICUgTU9EOwogICAgICAgIHAgPj49IDE7CiAgICB9CiAgICByZXR1cm4gaW52Owp9CgppbnQgbWFpbigpIHsKICAgIGNvbnN0IGludCBsaW0gPSAyMDAwMDA7CiAgICB2ZWN0b3I8bG9uZyBsb25nPiBpbnYobGltICsgMSwgMSk7CiAgICBmb3IgKGludCBpID0gMjsgaSA8PSBsaW07IGkrKykgaW52W2ldID0gZmludihpKTsKCiAgICBpbnQgdDsKICAgIGNpbiA+PiB0OwogICAgd2hpbGUgKHQpIHsKICAgICAgICB0LS07CiAgICAgICAgaW50IG47CiAgICAgICAgY2luID4+IG47CiAgICAgICAgdmVjdG9yPGludD4gY250KDIwKTsKICAgICAgICBmb3IgKGludCB4ID0gMTsgeCA8PSBuOyB4KyspIHsKICAgICAgICAgIGludCBiaXRzID0gMzIgLSBfX2J1aWx0aW5fY2x6KHgpOwogICAgICAgICAgY250W2JpdHNdKys7CiAgICAgICAgfQoKICAgICAgICB2ZWN0b3I8dmVjdG9yPGxvbmcgbG9uZz4+IGNvbWJzKDIwLCB2ZWN0b3I8bG9uZyBsb25nPigxLCAxKSk7CiAgICAgICAgZm9yIChpbnQgYiA9IDA7IGIgPCAyMDsgYisrKSB7CiAgICAgICAgICAgIGludCBteCA9IGNudFtiXTsKICAgICAgICAgICAgbG9uZyBsb25nIG5jciA9IDEsIGN1ciA9IDE7CiAgICAgICAgICAgIGZvciAoaW50IGsgPSAxOyBrIDw9IG14OyBrKyspIHsKICAgICAgICAgICAgICAgIG5jciA9IChteCAtIGsgKyAxKSAqIG5jciAlIE1PRDsKICAgICAgICAgICAgICAgIG5jciA9IGludltrXSAqIG5jciAlIE1PRDsKICAgICAgICAgICAgICAgIGN1ciA9IChjdXIgKyBuY3IpICUgTU9EOwogICAgICAgICAgICAgICAgY29tYnNbYl0ucHVzaF9iYWNrKGN1cik7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGxvbmcgbG9uZyBhbnMgPSAwOwogICAgICAgIGZvciAoaW50IGIgPSAwOyBiIDwgMjA7IGIrKykgewogICAgICAgICAgICBpbnQgbXggPSBjbnRbYl07CiAgICAgICAgICAgIGZvciAoaW50IHYgPSAxOyB2IDw9IG14OyB2KyspIHsKICAgICAgICAgICAgICAgIGxvbmcgbG9uZyBjID0gKGNvbWJzW2JdW3ZdIC0gY29tYnNbYl1bdiAtIDFdICsgTU9EKSAlIE1PRDsKICAgICAgICAgICAgICAgIGZvciAoaW50IGJiID0gMDsgYmIgPCAyMDsgYmIrKykgewogICAgICAgICAgICAgICAgICAgIGlmIChiYiA9PSBiKSBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICBpZiAoYmIgPCBiKSBjICo9IGNvbWJzW2JiXVttaW4oY250W2JiXSwgdiAtIDEpXTsKICAgICAgICAgICAgICAgICAgICBlbHNlIGMgKj0gY29tYnNbYmJdW21pbihjbnRbYmJdLCB2KV07CiAgICAgICAgICAgICAgICAgICAgYyAlPSBNT0Q7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBhbnMgKz0gYyAqIHY7CiAgICAgICAgICAgICAgICBhbnMgJT0gTU9EOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvdXQgPDwgYW5zIDw8ICdcbic7CiAgICB9CiAgICByZXR1cm4gMDsKfQo=