题意:构造出n个不同的数字a[i](a[i]<=1e6) 要求这n个数字的异或和正好为x. (n,x<=1e5.)
若y==x 则剩下三个为pw,pw*2,pw^(pw*2).
若有解 输出任意一个可行解.
当n==2 x==0时 显然只能为两个相同的数 此时无解,否则一定有解.
构造:n<=1e5,令pw=2^17先输出前n-3个数字1,2...n-3. 令这部分异或和为y若y==x 则剩下三个为pw,pw*2,pw^(pw*2).
若y!=x 则剩下为0,pw,(pw^x^y) (当y==x时 会出现两个pw,pw).
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+20;
int n,x;
int main()
{
while(cin>>n>>x)
{
if(n==2&&x==0)
{
printf("NO\n");
continue;
}
puts("YES");
int y=0,pw=1<<17;
for(int i=1;i<=n-3;i++)
y^=i,printf("%d ",i);
int res=y;
if(n==1)
printf("%d\n",x);
if(n==2)
printf("0 %d\n",x);
if(n>=3)
{
if(y==x)
printf("%d %d %d\n",pw,pw*2,pw+(pw*2));//res=res^pw^(pw*2)^((pw*2)^pw);
else
printf("0 %d %d\n",pw,(pw^x^y));//res=res^pw^(pw^x^y);
}
//printf("%d\n",res);
}
return 0;
}