#include<cstdio>
#define get(x) ((x)^((x)>>1))
using namespace std;
const int maxs=1<<17|5;
int n,m,A,B,ans[maxs];
int cnt(int x){int ret=0;while(x) x-=x&-x,ret++;return ret;}
inline void add(int&x,int&y,int L){x|=(y&1)<<L;y>>=1;}
int main(){
	scanf("%d%d%d",&n,&A,&B);B^=A;
	int n1=cnt(B),n2=n-n1;
	if(!(n1&1)) return puts("NO")&0;
	puts("YES");
	for (int i=0,si=1<<n1;i<si;i++){
		int now=0,s=i;
		for (int j=1<<n1-1;s;j>>=2) if(s&j){
			now|=j|(j>>1)*((s+3&3)>>1);
			s=(s^j)>>1;
		}else{now|=get(s);break;}
		for (int j=0,sj=1<<n2;j<sj;j++){
			int x=now,y=get(i&1?sj-1-j:j);
			for (int k=0;k<n;k++)
			add(ans[m],B&(1<<k)?x:y,k);
			m++;
		}
	}
	for (int i=0,si=1<<n;i<si;i++)
	printf("%d ",ans[i]^A);
	putchar('\n');
	return 0;
}