#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")