不难发现只有n=2,x=0时才输出NO
特判n=1,2时
当n>=3:
令xorSum=1^2^3^….^(n-3)
t=x^xorSum
则可以构造出:
t!=0:1,2,3,....(n−3),t+(1<<18),(1<<18),0
t==0:1,2,3,...,(n−2),(1<<18),[n−2+(1<<18)]
#include<stdio.h>
#include<bits/stdc++.h>
#define ll long long
#define pii pair<int,int>
#define pll pair<ll,ll>
#define MEM(a,x) memset(a,x,sizeof(a))
#define lowbit(x) ((x)&-(x))
using namespace std;
const int INF = 1e9+7;
const int inf=INF;
int main(){
//freopen("/home/lu/code/r.txt","r",stdin);
//freopen("/home/lu/code/w.txt","w",stdout);
int n,x;
while(~scanf("%d%d",&n,&x)){
if(n==2&&x==0){
puts("NO");
}
else{
puts("YES");
if(n==1){
printf("%d\n",x);
}
if(n==2){
printf("%d %d\n",(1<<18)+x,(1<<18));
}
if(n>=3){
int y=0;
for(int i=1;i<=n-3;++i){
y^=i;
}
int t=y^x;
for(int i=1;i<=n-3;++i){
printf("%d ",i);
}
if(t!=0){
printf("%d %d %d\n",0,t+(1<<18),(1<<18));
}
else{
printf("%d %d %d\n",n-2,(n-2)+(1<<18),(1<<18));
}
}
}
}
return 0;
}