#define int long longvoid solve() {
vector<int> mi(40);
for (int i = 0; i < 40; ++i) mi[i] = 1LL << i;
int _;
cin >> _;
for (int ts = 0; ts < _; ++ts) {
int n;
cin >> n;
vector<int> data(n);
for (auto &item: data) cin >> item;
int sum = 0;
for (auto &item: data) sum += item;
if (sum % n != 0) {
cout << "No" << endl;
continue;
}
sum /= n;
struct cmp {
bool operator()(const int &lhs, const int &rhs) const {
return abs(lhs) < abs(rhs);
}
};
priority_queue<int, vector<int>, cmp> depart;
map<int, int, greater<>> pos, neg;
bool flag = true;
for (int i = 0; i < n; ++i) {
int dif = data[i] - sum;
if (dif == 0) continue;
if (abs(dif) == *lower_bound(mi.begin(), mi.end(), abs(dif))) {
// good gay
(dif > 0 ? pos : neg)[abs(dif)]++;
} else {
// bad gay
int b = *upper_bound(mi.begin(), mi.end(), abs(dif));
b *= dif > 0 ? 1 : -1;
int s = dif - b;
if (abs(s) != *lower_bound(mi.begin(), mi.end(), abs(s))) {
flag = false;
break;
}
depart.push(b);
depart.push(s);
}
}
if (!flag) {
cout << "NO" << endl;
continue;
}
while (!depart.empty() || !pos.empty() || !neg.empty()) {
if (depart.empty()) {
auto posIter = pos.begin(), negIter = neg.begin();
if (posIter->first == negIter->first) {
int tmp = min(posIter->second, negIter->second);
posIter->second -= tmp;
negIter->second -= tmp;
if (posIter->second == 0) pos.erase(posIter);
if (negIter->second == 0) neg.erase(negIter);
continue;
}
auto &iter = posIter->first > negIter->first ? posIter : negIter;
auto mx = posIter->first > negIter->first ? 1 : -1;
auto &u = posIter->first > negIter->first ? pos : neg;
auto &v = posIter->first > negIter->first ? neg : pos;
auto tIter = v.find(iter->first / 2);
if (tIter == v.end()) {
flag = false;
break;
}
int tmp = min(iter->second, tIter->second);
for (int i = 0; i < tmp; ++i) depart.push(mx * iter->first / 2);
iter->second -= tmp;
tIter->second -= tmp;
if (iter->second == 0) u.erase(iter);
if (tIter->second == 0) v.erase(tIter);
}
while (!pos.empty() || !neg.empty()) {
auto posIter = pos.begin();
auto negIter = neg.begin();
bool posWin = negIter == neg.end() || (posIter != pos.end() && posIter->first > negIter->first);
auto &maxIter = posWin ? posIter : negIter;
auto &maxLink = posWin ? pos : neg;
auto mx = posWin ? 1 : -1;
if (maxIter->first > abs(depart.top())) {
for (int i = 0; i < maxIter->second; ++i) depart.push(mx * maxIter->first);
maxLink.erase(maxIter);
} else {
break;
}
}
int cnt[2] = {depart.top() < 0, depart.top() > 0};
int cur = abs(depart.top());
depart.pop();
while (!depart.empty() && abs(depart.top()) == cur) {
cnt[0] += depart.top() < 0;
cnt[1] += depart.top() > 0;
depart.pop();
}
// receives from not good gay
int tmp = min(cnt[0], cnt[1]);
cnt[0] -= tmp;
cnt[1] -= tmp;
if (cnt[0] == 0 && cnt[1] == 0) continue;
int left = cnt[0] > 0 ? 0 : 1;
auto &link = cnt[0] > 0 ? pos : neg;
int mx = cnt[0] > 0 ? -1 : 1;
// find in pos which is equals to this gay
auto iter = link.find(cur);
if (iter != link.end()) {
tmp = min(cnt[left], iter->second);
iter->second -= tmp;
cnt[left] -= tmp;
if (iter->second == 0) link.erase(iter);
}
if (cnt[left] == 0) continue;
// not enough, find in pos which is half of this gay
iter = link.find(cur / 2);
if (iter != link.end()) {
tmp = min(cnt[left], iter->second);
for (int i = 0; i < tmp; ++i) depart.push(mx * cur / 2);
iter->second -= tmp;
cnt[left] -= tmp;
if (iter->second == 0) link.erase(iter);
}
if (cnt[left] != 0) {
flag = false;
break;
}
}
cout << (flag ? "YES" : "NO") << endl;
}
}