题目大意:


















参考代码:

#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int M=1e6+7;

int n,k,T;
LL B[M],pre[M],A[M],c[40];
LL vis[40];
int main(){
	scanf("%d",&T);
	while(T--){
		int f=0;
		scanf("%d%d",&n,&k);
		pre[0]=0;
		for(int i=1;i<n;i++){
			scanf("%lld",&B[i]);
			pre[i]=pre[i-1]^B[i];
		}
		int cnt=31;
		for(int i=0;i<=35;i++) c[i]=vis[i]=0;
	    for(int i=1;i<n;i++){
	    	for(int bit=30;bit>=0;bit--){
	    		if(B[i]==0) continue;
	    	    if((B[i]>>bit)&1){
	    	    	if(pre[i-1]&(1<<bit)){
					    if(vis[bit]&&!c[bit]){
					    	f=1;
					    }
						c[bit]=1; vis[bit]=1;
	    	    	}else {
	    	    		if(vis[bit]&&c[bit]){
					    	f=1;
					    }
						c[bit]=0; vis[bit]=1;
	    	    	}
	    	    	cnt--;
	    	    	break;
	    	    }
	    	}
	    }
        //cout<<f<<" "<<cnt<<"\n";
	    if(f || 1ll*k>(1ll<<cnt)){
	    	printf("-1\n"); continue;
	    } 
	    A[1]=0; cnt=0; k--;
	    while(k){
	    	while(vis[cnt]) cnt++;
	    	if(k&1)  c[cnt]=1;
	    	k>>=1;
	    	cnt++;
	    }
	    for(int bit=0;bit<=30;bit++) A[1]+=(c[bit]<<bit);
	    for(int i=2;i<=n;i++) {
              A[i]=A[1]^pre[i-1];
            if(A[i]>=(1ll<<30)){
                f=1;
            }
        }
        if(f){
            printf("-1\n"); continue;
        }
	    for(int i=1;i<=n;i++)  printf("%lld ",A[i]);
	    printf("\n");
	}	
}