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: Accepted)

#include <bits/stdc++.h>

using namespace std;

#define REP(i,n) for(ll (i) = (0);(i) < (n);++i)
#define REV(i,n) for(ll (i) = (n) - 1;(i) >= 0;--i)
#define PB push_back
#define EB emplace_back
#define MP make_pair
#define FI first
#define SE second
#define SHOW1d(v,n) {REP(WW,n)cerr << v[WW] << ' ';cerr << endl << endl;}
#define SHOW2d(v,WW,HH) {REP(W_,WW){REP(H_,HH)cerr << v[W_][H_] << ' ';cerr << endl;}cerr << endl;}
#define ALL(v) v.begin(),v.end()
#define Decimal fixed<<setprecision(20)
#define INF 1000000000
#define LLINF 1000000000000000000LL
#define MOD 1000000007
#define fastcin() cin.tie(0);ios::sync_with_stdio(false)

typedef long long ll;
typedef pair<ll,ll> P;

int seica(ll a, ll b){
	ll tmp = a ^ b;
	int ret = 0;
	REP(i, 20){
		if(tmp & (1 << i))ret++;
	}
	return ret;
}

void out(vector<int> v){
	cout << "YES" << endl;
	REP(i, v.size()){
		cout << v[i];
		if(i != v.size() - 1)cout << " ";
	}
	cout << endl;
}

vector<int> dfs(int s, int g, int mask, int n){
	if(n == 1){
		return {s, g};
	}
	
	REP(i, 20){
		if(!(mask & (1<<i)))continue;
		int a = s & (1<<i);
		int b = g & (1<<i);
		if(a == b)continue;
		int nmask = mask ^ (1<<i);
		REP(j, 20){
			if(!(nmask & (1<<j)))continue;
			int tmp = (s & nmask) ^ (1<<j);
			auto l = dfs(s & nmask, tmp, nmask, n - 1); 
			auto r = dfs(tmp, g & nmask, nmask, n - 1); 
			vector<int> ret;
			REP(k, l.size())ret.PB(l[k] | (s & (1<<i)));
			REP(k, r.size())ret.PB(r[k] | (g & (1<<i)));
			return ret;
		}
	}	
}

int main(){
	
	ll n, a, b;cin >> n >> a >> b;
		
	if(seica(a, b) % 2 == 0){
		cout << "NO" << endl;
		return 0;
	}
	
	out(dfs(a, b, (1<<n)-1, n));
	
	return 0;
}