Problem:
Score : 800 points

Problem Statement

You are given integers N,\ A and B.
Determine if there exists a permutation (P_0,\ P_1,\ ...\ P_{2^N-1}) of (0,\ 1,\ ...\ 2^N-1) that satisfies all of the following conditions, and create one such permutation if it exists.

P_0=A

P_{2^N-1}=B

For all 0 \leq i < 2^N-1, the binary representations of P_i and P_{i+1} differ by exactly one bit.

Constraints

1 \leq N \leq 17

0 \leq A \leq 2^N-1

0 \leq B \leq 2^N-1

A \neq B

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N A B

Output

If there is no permutation that satisfies the conditions, print NO.

If there is such a permutation, print YES in the first line.
Then, print (P_0,\ P_1,\ ...\ P_{2^N-1}) in the second line, with spaces in between.
If there are multiple solutions, any of them is accepted.

Sample Input 1

2 1 3

Sample Output 1

YES
1 0 2 3

The binary representation of P=(1,0,2,3) is (01,00,10,11), where any two adjacent elements differ by exactly one bit.

Sample Input 2

3 2 1

Sample Output 2

NO

Solution in C++14 (GCC 5.4.1) (judge verdict: Runtime Error)

#include <bits/stdc++.h>
#define LL long long
#define LD long double
#define pb push_back
#define mp make_pair
#define ss(x) (int) x.size()
#define fi first
#define se second
#define cat(x) cerr << #x << " = " << x << endl
#define rep(i, j, n) for (int i = j; i <= n; ++i)
#define per(i, j, n) for (int i = n; j <= i; --i)
#define all(x) x.begin(), x.end()

using namespace std;

int n, a, b;
int ans[1 << 17];
int full;

int bit(int mask) {
	rep(i, 0, n - 1)
		if ((mask >> i) & 1) return i;
	return -1;
}

void solve(int l, int r, int x, int y, int f) {
	if (l + 1 == r) {
		ans[l] = x;
		ans[r] = y;
		return;
	}
	int b = bit(x ^ y);
	int X = x;
	int Y = y;
	if ((x >> b) & 1) X ^= (1 << b);
	if ((y >> b) & 1) Y ^= (1 << b);
	int m = (l + r) / 2;
	int q = -1;
	rep(i, 0, n - 1)
		if (!((f >> i) & 1) && !(i == b)) {
			q = i;
			break;
		}
	int z = (X ^ (1 << q));
	solve(l, m, X, z, f ^ (1 << b));
	solve(m + 1, r, z, Y, f ^ (1 << b));
	if ((x >> b) & 1) rep(i, l, m) ans[i] ^= (1 << b);
	if ((y >> b) & 1) rep(i, m + 1, r) ans[i] ^= (1 << b);
}

int main() {
	scanf ("%d%d%d", &n, &a, &b);
	full = (1 << n) - 1;
	if (__builtin_popcount(a) % 2 == __builtin_popcount(b) % 2) return printf ("NO\n");
	printf ("YES\n");
	solve(0, full, a, b, 0);
	rep(i, 0, full) printf ("%d ", ans[i]);
	
    return 0;
}