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"
using namespace std;

#define FAST ios_base::sync_with_stdio(false); cin.tie(0);
#define pb push_back
#define eb emplace_back
#define ins insert
#define f first
#define s second
#define cbr cerr<<"hi\n"
#define mmst(x, v) memset((x), v, sizeof ((x)))
#define siz(x) ll(x.size())
#define all(x) (x).begin(), (x).end()
#define lbd(x,y) (lower_bound(all(x),y)-x.begin())
#define ubd(x,y) (upper_bound(all(x),y)-x.begin())
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());    //can be used by calling rng() or shuffle(A, A+n, rng)
inline long long rand(long long x, long long y) { return rng() % (y+1-x) + x; } //inclusivesss
string inline to_string(char c) {string s(1,c);return s;} template<typename T> inline T gcd(T a,T b){ return a==0?llabs(b):gcd(b%a,a); }

using ll=long long; 
using ld=long double;
#define FOR(i,s,e) for(ll i=s;i<=ll(e);++i)
#define DEC(i,s,e) for(ll i=s;i>=ll(e);--i)
using pi=pair<ll,ll>; using spi=pair<ll,pi>; using dpi=pair<pi,pi>; 

#define LLINF ((long long)1e18)
#define INF int(1e9+1e6)
#define MAXN (300006)
int main(){
	FAST
	ll n,a,b;
	cin>>n>>a>>b;
	auto c=[&](ll x){ return __builtin_popcount(x); };
	if(c(a) == c(b)) { cout<<"NO\n"; return 0; }
	cout<<"YES\n";
	function<vector<ll>(ll,ll,ll)> solve=[&](ll n,ll a,ll b){
		assert(a^b);
		if(n == 1){
			return vector<ll>{a&1, b&1};
		}
		auto expand=[&](ll x,ll bit){
			ll nval=0;
			FOR(i,0,18)if(1<<i&x){
				nval+=1<<(i+(i>=bit));
			}
			return nval;
		};
		auto compress=[&](ll x,ll bit){
			ll nval=0;
			FOR(i,0,18)if(i^bit)if(1<<i&x){
				nval+=1<<(i-(i>=bit));
			}
			return nval;
		};
		#define lsb(x) (__builtin_ctz(x))
		ll bit=lsb(a^b);
		ll oa=a,ob=b;
		a=compress(a,bit), b=compress(b,bit);
		ll c=a^1;
		vector<ll>A=solve(n-1,a,c);
		vector<ll>B=solve(n-1,b,c);
		for(auto&i:A) i=expand(i,bit);
		for(auto&i:B) i=expand(i,bit);
		if(1<<bit&oa)for(auto&i:A)i|=1<<bit;
		else for(auto&i:B)i|=1<<bit;
		while(B.size())A.eb(B.back()),B.pop_back();
		assert(A[0] == oa && A.back() == ob);
		return A;
	};
	vector<ll> ans = solve(n, a, b);
	for(auto i:ans) cout<<i<<' '; cout<<'\n';
}