非常巧妙的做法

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

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

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

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

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

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

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

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

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;
		}
	}
}