/*
cf862a构造 异或
http://blog.csdn.net/lzc504603913/article/details/78041909
给你一个数k,让你用n个不同的非负整数异或出k。
首先要利用a^a=0,a^0=a这个性质
题目要求异或结果为x,由于x^0=x,我们只要用多个数凑出0即可
看了题解后,最开始想到的是1,2,3...n-2,(1<<17),(1<<17)^(1^2^...^(n-2))^x,
前面n-2个数直接写,后面尽量构造两个不重复的数,能够抵消掉前面数字的异或和,只留下x
这里用1<<17是因为它大于10^5且小于10^6,最高位有一个1,保证异或后的值一定不会小于自己,且一定比n大。
然而当(1^2^...^(n-2))与x相同时,
最后一个数(1<<17)^(1^2^...^(n-2))^x=(1<<17)^0=(1<<17),重复
所以再引入(1<<18),构造数列为1,2,3...n-3,(1<<17),(1<<18),(1<<17)^(1<<18)^(1^2^...^(n-3))^x
这样,即使(1^2^...^(n-3))^x==0,(1<<17)^(1<<18)也保证不与前面任何一个数重复
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <vector>
#include <queue>
#include <cmath>
#include <algorithm>
#include <map>
#include <set>
#define ll long long 
#define fr(i,a,b) for(int i=a;i<=b;i++)
#define frr(i,a,b) for(int i=a;i>=b;i--)
#define ms(a,b) memset(a,b,sizeof(a))
#define scfd(a) scanf("%d",a)
#define scflf(a) scanf("%lf",a)
#define scfs(a) scanf("%s",a)
#define ptfd(a) printf("%d\n",a)
#define ptfs(a) printf("%s\n",a)
#define showd(a,b) printf(a"=%d\n",b)
#define showlf(a,b) printf(a"=%lf\n",b)
#define shows(a,b) printf(a"=%s\n",b)
#define mmcp(a,b) memcpy(a,b,sizeof(b))
#define pb(a) push_back(a)
using namespace std;
int n,x;
int main(){
    int t=1<<17;
    int tt=1<<18;
    cin>>n>>x;
    if(n==2&&!x){
        printf("NO\n");
        exit(0);
    }
    if(n==1){
        printf("YES\n%d\n",x);
        exit(0);
    }
    if(n==2){
        printf("YES\n%d %d\n",x,0);
        exit(0);
    }
    puts("YES");
    fr(i,1,n-3)
        printf("%d ",i);
    int f=0;
    fr(i,1,n-3)
        f^=i;
    printf("%d %d %d\n",tt,t,t^tt^x^f);
    return 0;
}
 posted on 2017-09-27 14:51  cylcy  阅读(104)  评论(0编辑  收藏  举报