用二进制处理。
线性基可异或出的集合为2^cnt(不选数是0)
我们需要这样的线性基,每个数的最高位唯一是1,(换句话说,其他数的当前位是0.)
这样一来,选的数不同,异或出的结果也一定不同,这个序列也是个线性基。
而且可以用二进制分解第k大。
比如第3大等于 第2小的数加上第1小的数。
//#include <bits/stdc++.h>
#include<iostream>
#include<cmath>
#include<cstdio>
#include<map>
#include<set>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
#define ls (o<<1)
#define rs (o<<1|1)
#define pb push_back
const double PI= acos(-1.0);
const int M = 1e5+7;
/*
int head[M],cnt;
void init(){cnt=0,memset(head,-1,sizeof(head));}
struct EDGE{int to,nxt,val;}ee[M*2];
void add(int x,int y){ee[++cnt].nxt=head[x],ee[cnt].to=y,head[x]=cnt;}
*/
int nm;
ll p[70];
void in(ll x)
{
for(int i=60;i>=0;i--)
{
if(x>>i&1)
{
if(p[i])x^=p[i];
else
{
p[i]=x;nm++;
break;
}
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int t;
cin>>t;
for(int ca=1;ca<=t;ca++)
{
ll n,x;
memset(p,0,sizeof(p));
cin>>n;nm=0;//线性基里的数,不等于n说明有数没插进去,说明多个数异或和等于0
for(int i=1;i<=n;i++)cin>>x,in(x);
int q;cin>>q;
cout<<"Case #"<<ca<<":"<<endl;
// for(int i=1;i<=nm;i++)
// cout<<"---- "<<i<<" "<<v[i]<<endl;
for(int i=0;i<=60;i++)//预处理成每个数的最高位唯一是1,其他数的当前位都是0
for(int j=0;j<i;j++)
if(p[i]&&p[j]&&(p[i]>>j&1))p[i]^=p[j];
while(q--)
{
ll k;
cin>>k;
if(nm!=n)k--;//去掉0的情况
// cout<<k<<" "<<nm<<endl;
if(k>(1ll<<nm)-1)cout<<-1<<endl;
else
{
ll ans=0;
for(int i=0;i<=60;i++)
{
if(p[i])
{
if(k&1)ans^=p[i];
k/=2;
}
}
cout<<ans<<endl;
}
}
}
return 0;
}