#include <bits/stdc++.h>

using namespace std;

int n, a, b;
char used[1 << 17];
vector<int> g[1 << 17];
bool ok = false;
vector<int> cur;

void dfs(int v){
    used[v] = true;
    cur.push_back(v);
    if(cur.size() == (1 << n) && cur.back() == b){
        ok = true;
        for(auto u : cur){
            cout << u << ' ';
        }
        cout << endl;
    }
    for(int to : g[v]){
        if(!used[to] && !ok){
            dfs(to);
        }
    }
    used[v] = false;
    cur.pop_back();
}

mt19937 mt(time(0));

typedef struct item * pitem;
struct item {
	int prior, value, cnt=0;
	bool rev=0;
	pitem l=NULL, r=NULL;
	item(int p, int v): prior(p), value(v) {}
};

int cnt (pitem it) {
	return it ? it->cnt : 0;
}

void upd_cnt (pitem it) {
	if (it)
		it->cnt = cnt(it->l) + cnt(it->r) + 1;
}

void push (pitem it) {
	if (it && it->rev) {
		it->rev = false;
		swap (it->l, it->r);
		if (it->l)  it->l->rev ^= true;
		if (it->r)  it->r->rev ^= true;
	}
}

void merge (pitem & t, pitem l, pitem r) {
	push (l);
	push (r);
	if (!l || !r)
		t = l ? l : r;
	else if (l->prior > r->prior)
		merge (l->r, l->r, r),  t = l;
	else
		merge (r->l, l, r->l),  t = r;
	upd_cnt (t);
}

void split (pitem t, pitem & l, pitem & r, int key, int add = 0) {
	if (!t)
		return void( l = r = 0 );
	push (t);
	int cur_key = add + cnt(t->l);
	if (key <= cur_key)
		split (t->l, l, t->l, key, add),  r = t;
	else
		split (t->r, t->r, r, key, add + 1 + cnt(t->l)),  l = t;
	upd_cnt (t);
}

void insert (pitem & t, pitem item, int pos) {
	if(!t) t = item;
    else{
        pitem left, right;
        split(t, left, right, pos);
        merge(left, left, item);
        merge(t, left, right);
    }
    upd_cnt(t);
}

void reverse (pitem t, int l, int r) {
	pitem t1, t2, t3;
	split (t, t1, t2, l);
	split (t2, t2, t3, r-l+1);
	t2->rev ^= true;
	merge (t, t1, t2);
	merge (t, t, t3);
}

void output (pitem t) {
	if (!t)  return;
	push (t);
	output (t->l);
	printf ("%d ", t->value);
	output (t->r);
}

pitem root;

int32_t main()
{
    ios_base::sync_with_stdio(false);
    cin >> n;
//    for(int i = 0; i < (1 << n); i++){
//        for(int j = 0; j < n; j++){
//            int to = i;
//            if(i & (1 << j)) to -= (1 << j);
//            else to += (1 << j);
//            g[i].push_back(to);
//        }
//    }
//
//    cout << "GRAY: ";
//    for(int i = 0; i < (1 << n); i++){
//        int res = i ^ (i >> 1);
//        cout << res << ' ';
//    }
//    cout << endl;
//    for(int i = 0; i < (1 << n); i++){
//        for(int j = i + 1; j < (1 << n); j++){
//            a = i;
//            b = j;
//            cur.clear();
//            ok = false;
//
//            int t = a ^ b;
//            for(int j = 0; j < n; j++){
//                if(t & (1 << j)) ok ^= 1;
//            }
//
//            cout << a << ' ' << b <<  " : ";
//            if(!ok) cout << "FAIL" << endl;
//            else {
//                ok = false;
//                dfs(a);
//            }
//        }
//    }

    cin >> a >> b;

    int t = a ^ b;
    bool ok = false;
    for(int i = 0; i < n; i++){
        if(t & (1 << i)) ok ^= true;
    }
    if(!ok){
        cout << "NO";
        return 0;
    }
    else{
        cout << "YES" << endl;
    }

    vector<int> c;
    for(int i = 0; i < (1 << n); i++){
        int res = i ^ (i >> 1);
        c.push_back(res ^ a);
    }
    int need = 0;
    for(int j = c.size() - 1; j >= 0; j -= 2){
        if(c[j] == b){
            break;
        }
        need++;
    }
    for(int i = 0; i < c.size(); i++){
        pitem kek = new item(mt(), c[i]);
        insert(root, kek, i);
    }
    for(int i = 0; i < need; i++){
        int r = c.size() - 1;
        int l = r - ((i+1) * 2);
        reverse(root, l, r);
    }
    output(root);
    return 0;
}


Measured memory_bytes: 10744