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: Wrong Answer)

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define x first
#define y second
#define bug(x) cerr<<#x<<'='<<x<<' '
#define debug(x) cerr<<#x<<'='<<x<<'\n'
#define FOR(a,b,c) for(int a=(b),a##_end=(c);a<=a##_end;++a)
#define ROF(a,b,c) for(int a=(b),a##_end=(c);a>=a##_end;--a)
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
const int INF=0x3f3f3f3f,N=2e5+10,P=1e9+7;
template<class T>inline bool chkmin(T &A,const T &B){return B<A?A=B,1:0;}
template<class T>inline bool chkmax(T &A,const T &B){return A<B?A=B,1:0;}
int n,A,B,id[20],cnt0,cnt1;
int vis[N],a[N],b[N];
int res[N],tot;
int Get(int S){
	int res=0;
	FOR(i,0,cnt1-1)if(S>>i&1)
		res|=1<<id[i];
	int now=0;
	FOR(i,cnt1,n-1){
		while(B>>now&1)++now;
		if(S>>i&1)
			res|=1<<now;
		++now;
	}
	return res;
}
int main(){
	scanf("%d%d%d",&n,&A,&B);
	if(__builtin_popcount(A^B)%2==0||n%2){
		puts("NO");
		return 0;
	}
	puts("YES");
	B^=A;
	memset(id,-1,sizeof(id));
	FOR(i,0,n-1)if(B>>i&1)
		id[cnt1++]=i;
	cnt0=n-cnt1;
		
	memset(vis,0,sizeof(vis));
	vis[0]=vis[(1<<cnt0)-1]=1;
	FOR(i,0,(1<<cnt0)-3){
		FOR(j,0,cnt0-1){
			if(!vis[a[i]^(1<<j)]){
				a[i+1]=a[i]^(1<<j);
				vis[a[i+1]]=1;
				break;
			}
		}
	}
	a[(1<<cnt0)-1]=(1<<cnt0)-1;

	memset(vis,0,sizeof(vis));
	vis[0]=vis[(1<<cnt1)-1]=1;
	FOR(i,0,(1<<cnt1)-3){
		FOR(j,0,cnt1-1){
			if(!vis[b[i]^(1<<j)]){
				b[i+1]=b[i]^(1<<j);
				vis[b[i+1]]=1;
				break;
			}
		}
	}
	b[(1<<cnt1)-1]=(1<<cnt1)-1;
	
	FOR(i,0,(1<<cnt1)-1){
		if(i%2==0){
			FOR(j,0,(1<<cnt0)-1)
				res[++tot]=a[j]<<cnt1|b[i];
		}else{
			ROF(j,(1<<cnt0)-1,0)
				res[++tot]=a[j]<<cnt1|b[i];
		}
	}
	FOR(i,1,tot)printf("%d ",A^Get(res[i]));
	return 0;
}