非常巧妙的做法

碰到这种题别想着硬来一个一个构造,多往异或性质上想一想

对 于 n > = 3 的 情 况 对于n>=3的情况 对于n>=3的情况

首 先 把 [ 1 , n − 3 ] 全 都 选 上 去 , 设 异 或 和 是 y 首先把[1,n-3]全都选上去,设异或和是y 首先把[1,n−3]全都选上去,设异或和是y

现 在 我 们 构 造 了 n − 3 个 数 , 还 剩 三 个 数 设 为 a , b , c 现在我们构造了n-3个数,还剩三个数设为a,b,c 现在我们构造了n−3个数,还剩三个数设为a,b,c

由 于 最 后 异 或 和 要 变 成 x 由于最后异或和要变成x 由于最后异或和要变成x

也 就 是 y ⊕ a ⊕ b ⊕ c = x 也就是y\oplus{a}\oplus{b}\oplus{c}=x 也就是y⊕a⊕b⊕c=x

也 就 是 y ⊕ a ⊕ b ⊕ ( a ⊕ b ⊕ y ⊕ x ) = x 也就是y\oplus{a}\oplus{b}\oplus(a\oplus{b}\oplus{y}\oplus{x})=x 也就是y⊕a⊕b⊕(a⊕b⊕y⊕x)=x

要 保 证 a , b , ( a ⊕ b ⊕ y ⊕ x ) 不 和 前 面 的 数 冲 突 要保证a,b,(a\oplus{b}\oplus{y}\oplus{x})不和前面的数冲突 要保证a,b,(a⊕b⊕y⊕x)不和前面的数冲突

a 取 ( 1 < < 17 ) , b 取 ( 1 < < 18 ) , 这 样 这 些 数 因 为 高 位 1 的 不 同 一 定 不 会 冲 突 a取(1<<17),b取(1<<18),这样这些数因为高位1的不同一定不会冲突 a取(1<<17),b取(1<<18),这样这些数因为高位1的不同一定不会冲突

完 美 解 决 完美解决 完美解决

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <string>
#include <vector>
#include <bitset>
#include <stack>
#include <cmath>
#include <deque>
#include <queue>
#include <list>
#include <set>
#include <map>
#pragma comment(linker, "/STACK:1024000000,1024000000")
#define line printf("---------------------------\n")
#define mem(a, b) memset(a, b, sizeof(a))
#define pi acos(-1)
using namespace std;
typedef long long ll;
const double eps = 1e-9;
const int inf = 0x3f3f3f3f;
const int mod = 1e9+7;
const int maxn = 1000+10;

int main() {
int n, x;
while(cin >> n >> x) {
if(n == 1) {
cout << "YES" << endl << x << endl;
} else if(n == 2) {
if(x == 0) {
cout << "NO" << endl;
} else {
cout << "YES" << endl << 0 << " " << x << endl;
}
} else {
cout << "YES" << endl;
int X = 1 << 17, Y = 1 << 18, Z = 0;
for(int i = 1; i <= n - 3; i++) {
cout << i << " ";
Z ^= i;
}
cout << X << " " << Y << " " << (X ^ Y ^ Z ^ x) << endl;
}
}
}