分析
首先我们发现要让答案最小,或运算一定是没有用的
我们还可以发现a^b = a&(~b)
所以异或运算也没有用
于是我们只考虑否和与
我们还会得到一个性质就是没增加一个数一定会让答案的1的个数至少减少一半
因为我们会让答案与上a和(~a)中是的答案的0的数量增加最多的一个
所以最坏增加剩余1的数量的一半
所以当n大于9时一定使答案为0
于是我们只需要在n小于等于9的时候2^n枚举所有情况去最小值即可
代码
#include<bits/stdc++.h>
using namespace std;
#define int unsigned long long
int n,m,a[],now,Ans;
inline void go(int wh){
if(wh==n){
Ans=min(Ans,now);
return;
}
int be=now;
now=be&(a[wh+]);
go(wh+);
now=be&(~a[wh+]);
go(wh+);
}
signed main(){
int i,j,k;
int t;
cin>>t;
while(t--){
cin>>n;
for(i=;i<=n;i++)cin>>a[i];
Ans=~(int);
if(n>=)puts("");
else now=~(int),go(),printf("%llu\n",Ans);
}
return ;
}