#include <bits/stdc++.h>
using namespace std;
const long long MOD = 1000000007LL;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T;
if (!(cin >> T)) return 0;
// Precompute C[n][k] cho n,k <= 62 là dư dả (n <= 60 bit)
const int MAXN = 65;
long long C[MAXN][MAXN];
for (int i = 0; i < MAXN; ++i) {
C[i][0] = C[i][i] = 1;
for (int j = 1; j < i; ++j) {
C[i][j] = (C[i-1][j-1] + C[i-1][j]) % MOD;
}
}
while (T--) {
unsigned long long n;
cin >> n;
if (n == 0) { // không xảy ra theo đề, nhưng cho chắc
cout << 1 << '\n';
continue;
}
// tách bit của n
vector<int> a;
while (n > 0) {
a.push_back(n & 1ULL);
n >>= 1ULL;
}
int L = (int)a.size() - 1;
// dp[carry] = số cách
// carry tối đa cỡ ~ L nên cấp mảng dư dả một chút
const int CARRY_MAX = 80;
vector<long long> dp(CARRY_MAX, 0), ndp(CARRY_MAX, 0);
dp[0] = 1;
for (int t = 0; t <= L; ++t) {
fill(ndp.begin(), ndp.end(), 0);
for (int carry = 0; carry < CARRY_MAX; ++carry) if (dp[carry]) {
for (int x = 0; x <= t + 1; ++x) { // chọn x biến bật ở đường chéo t
if (((x + carry) & 1) == a[t]) {
int carry2 = (x + carry) >> 1;
if (carry2 < CARRY_MAX) {
ndp[carry2] = (ndp[carry2] + dp[carry] * C[t+1][x]) % MOD;
}
}
}
}
dp.swap(ndp);
}
// sau cột cao nhất, không còn biến để chọn nên chỉ hợp lệ khi carry=0
cout << dp[0] % MOD << '\n';
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBsb25nIGxvbmcgTU9EID0gMTAwMDAwMDAwN0xMOwoKaW50IG1haW4oKSB7CiAgICBpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKG51bGxwdHIpOwoKICAgIGludCBUOwogICAgaWYgKCEoY2luID4+IFQpKSByZXR1cm4gMDsKCiAgICAvLyBQcmVjb21wdXRlIENbbl1ba10gY2hvIG4sayA8PSA2MiBsw6AgZMawIGThuqMgKG4gPD0gNjAgYml0KQogICAgY29uc3QgaW50IE1BWE4gPSA2NTsKICAgIGxvbmcgbG9uZyBDW01BWE5dW01BWE5dOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhOOyArK2kpIHsKICAgICAgICBDW2ldWzBdID0gQ1tpXVtpXSA9IDE7CiAgICAgICAgZm9yIChpbnQgaiA9IDE7IGogPCBpOyArK2opIHsKICAgICAgICAgICAgQ1tpXVtqXSA9IChDW2ktMV1bai0xXSArIENbaS0xXVtqXSkgJSBNT0Q7CiAgICAgICAgfQogICAgfQoKICAgIHdoaWxlIChULS0pIHsKICAgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgbjsgCiAgICAgICAgY2luID4+IG47CgogICAgICAgIGlmIChuID09IDApIHsgLy8ga2jDtG5nIHjhuqN5IHJhIHRoZW8gxJHhu4EsIG5oxrBuZyBjaG8gY2jhuq9jCiAgICAgICAgICAgIGNvdXQgPDwgMSA8PCAnXG4nOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIC8vIHTDoWNoIGJpdCBj4bunYSBuCiAgICAgICAgdmVjdG9yPGludD4gYTsKICAgICAgICB3aGlsZSAobiA+IDApIHsKICAgICAgICAgICAgYS5wdXNoX2JhY2sobiAmIDFVTEwpOwogICAgICAgICAgICBuID4+PSAxVUxMOwogICAgICAgIH0KICAgICAgICBpbnQgTCA9IChpbnQpYS5zaXplKCkgLSAxOwoKICAgICAgICAvLyBkcFtjYXJyeV0gPSBz4buRIGPDoWNoCiAgICAgICAgLy8gY2FycnkgdOG7kWkgxJFhIGPhu6EgfiBMIG7Dqm4gY+G6pXAgbeG6o25nIGTGsCBk4bqjIG3hu5l0IGNow7p0CiAgICAgICAgY29uc3QgaW50IENBUlJZX01BWCA9IDgwOwogICAgICAgIHZlY3Rvcjxsb25nIGxvbmc+IGRwKENBUlJZX01BWCwgMCksIG5kcChDQVJSWV9NQVgsIDApOwogICAgICAgIGRwWzBdID0gMTsKCiAgICAgICAgZm9yIChpbnQgdCA9IDA7IHQgPD0gTDsgKyt0KSB7CiAgICAgICAgICAgIGZpbGwobmRwLmJlZ2luKCksIG5kcC5lbmQoKSwgMCk7CiAgICAgICAgICAgIGZvciAoaW50IGNhcnJ5ID0gMDsgY2FycnkgPCBDQVJSWV9NQVg7ICsrY2FycnkpIGlmIChkcFtjYXJyeV0pIHsKICAgICAgICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDw9IHQgKyAxOyArK3gpIHsgLy8gY2jhu41uIHggYmnhur9uIGLhuq10IOG7nyDEkcaw4budbmcgY2jDqW8gdAogICAgICAgICAgICAgICAgICAgIGlmICgoKHggKyBjYXJyeSkgJiAxKSA9PSBhW3RdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGludCBjYXJyeTIgPSAoeCArIGNhcnJ5KSA+PiAxOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FycnkyIDwgQ0FSUllfTUFYKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZHBbY2FycnkyXSA9IChuZHBbY2FycnkyXSArIGRwW2NhcnJ5XSAqIENbdCsxXVt4XSkgJSBNT0Q7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZHAuc3dhcChuZHApOwogICAgICAgIH0KCiAgICAgICAgLy8gc2F1IGPhu5l0IGNhbyBuaOG6pXQsIGtow7RuZyBjw7JuIGJp4bq/biDEkeG7gyBjaOG7jW4gbsOqbiBjaOG7iSBo4bujcCBs4buHIGtoaSBjYXJyeT0wCiAgICAgICAgY291dCA8PCBkcFswXSAlIE1PRCA8PCAnXG4nOwogICAgfQogICAgcmV0dXJuIDA7Cn0K