& :按位与, 两两对应有0就出0
|:按位或,
^:按位异或,
//分析:
//求第k大:把k二进制拆分,如果k的第i位上是1,ans^=b[i]
//d[i]表明第i位(权为2^i)是否为1,并存入使第i位为1的线性基是几
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const int maxn=63;
ll d[maxn+1];
int main(){
int t,id=0,r,n,m,k;
ll x;
cin>>t;
while(t--){
memset(d,0,sizeof(d));
scanf("%d",&n);r=0;
//求线性基
for(int i=1;i<=n;i++){
scanf("%lld",&x);
for(int j=maxn;j>=0;j--){
if(x&(1ll<<j)){//x和这一位与,只有x的这一位为1才出1 即考虑
//若这位之前没出现过,则标记
if(d[j]==0){
d[j]=x;
break;
}
//若该位已经有了,则需在x里删去该位,即异或
x^=d[j];
}
}
}
//化最简线性基
for(int i=maxn;i>=0;i--){
//因为最高位存的数最大,所以从最高位开始删
if(d[i]==0) continue;
for(int j=i+1;j<=maxn;j++)//一定要这个顺序吗?
if(d[j]&(1ll<<i))
d[j]^=d[i];
}
//把没用的空位去掉
for(int i=0;i<=maxn;i++)
if(d[i]) d[r++]=d[i];
printf("Case #%d:\n",++id);
scanf("%d",&m);
while(m--){
scanf("%d",&k);
//如果r=n,就说明每个数字都有会贡献1个1,那么就绝对不可能取到0。
if(r!=n) k--; //否则就包含 要减1
//因为上面是r++,所以r多加了一个,所以最多可组成2^r-1种情况(不含0,0上面已经删去了)
if(k>=(1ll<<r)) puts("-1");
else{
ll ans=0;
for(int i=0;i<=maxn&&i<=r;i++){
if(k&(1ll<<i)) ans^=d[i];
//k转二进制
}
printf("%lld\n",ans);
}
}
}
}