#include <any>
#include <iostream>
#include <vector>
using namespace std;
class Total_set {
public:
vector<int> parent; // 父节点数组
vector<int> cnt; // 每个集合的账号数量
Total_set(const int size) {
parent.resize(size);
cnt.resize(size, 0);
for (int i = 0; i < size; ++i) {
parent[i] = i; // 初始父节点为自己
}
}
int find(const int& x) {
if (parent[x] != x) {
return find(parent[x]);
}
return x;
}
void unite(int x, int y) {
x = find(x);
y = find(y);
if (x == y) return;
// 总将小根作为父节点,保证合并方向一致
if (x > y) {
swap(x, y);
}
parent[y] = x;
cnt[x] += cnt[y];
}
};
void solve() {
int n;
cin >> n;
Total_set uf(61); // 0-60位
for (int i = 0; i < n; ++i) {
long long w;
cin >> w;
vector<int> bits;
// 分解数字为二进制位:获取所有为1的位
while (w) {
int b = __builtin_ctzll(w); // 获取最低位的1的位置
bits.push_back(b);
w ^= (1LL << b); // 清除已处理的位
}
if (bits.empty()) continue; // w=0的情况(题目保证w≥1,可省略)
// 合并所有位到第一个位的集合
int root = uf.find(bits[0]);
for (int j = 1; j < bits.size(); ++j) {
uf.unite(root, bits[j]);
}
// 将当前账号计数加到合并后的根节点
root = uf.find(root);
uf.cnt[root]++;
}
// 遍历所有位,找到最大集合
int max_count = 0;
for (int b = 0; b <= 60; ++b) {
if (uf.find(b) == b) { // 只检查根节点
max_count = max(max_count, uf.cnt[b]);
}
}
cout << max_count << '\n';
}
int main() {
int T;
cin >> T;
while (T--) {
solve();
}
return 0;
}
// 64 位输出请用 printf("%lld")