#include <bits/stdc++.h>
using namespace std;
 
typedef pair<int,int> pii;
typedef long long ll;

void fastStream(){cin.tie(0);std::ios_base::sync_with_stdio(0);}

int N, A, B;
int ary[1000010];
int ans[1000010];

// 0....0 -> 0...1 or 0...1 -> 0....0 の全列挙
void rec(int *seq, int len, int cnt){
    if(cnt == 0) return;
    if(seq[0] == 0){
        for(int i = 0; i < len; i++)
            seq[i] *= 2;
        for(int i = 0; i < len; i++)
            seq[2 * len - 1 - i] = seq[i] + 1;
    }
    else{
        for(int i = 0; i < len; i++)
            seq[i + len] = seq[i] * 2;
        for(int i = 0; i < len; i++)
            seq[i] = seq[len - 1 - i + len] + 1;
    }
    rec(seq, len * 2, cnt - 1);
}

int main(){

    cin >> N >> A >> B;
    const int X = A ^ B;
    if(__builtin_popcount(X) % 2){
        deque<int> ord; // 元の場所が値、インデックスが現在の場所
        int one_cnt = 0;
        for(int i = 0; i < N; i++){
            if((X >> i) & 1){
                ord.push_back(i);
                one_cnt++;
            }
            else{
                ord.push_front(i);
            }
        }
        
        int sz = 0;
        int pos = 0;
        int upper = 0;
        while(1){
            // あと1つうめる　
            if(N - pos == 1){
                ans[sz++] = upper | 0;
                ans[sz++] = upper | 1;
                break;
            }
            // あと1つうめる
            else if(N - pos == 2){
                ans[sz++] = upper | 0b00;
                ans[sz++] = upper | 0b01;
                ans[sz++] = upper | 0b11;
                ans[sz++] = upper | 0b10;
                break;
            }

            // 現在の一番上の桁を0に固定
            ary[0] = 0;
            rec(ary, 1, (N - 1 - pos));
            for(int i = 0; i < (1 << (N - 1 - pos)); i++){
                ans[sz++] = upper | ary[i];
            }

            // 次に、現在の場所を1にして、その上で計算を行う
            upper |= (1 << (N - 1 - pos));
            pos++;

            if(pos == one_cnt){
                ary[0] = 1;
                ary[1] = 0;
                rec(ary, 2, (N - 1 - pos));
                for(int i = 0; i < (1 << (N - pos)); i++){
                    ans[sz++] = upper | ary[i];
                }
                break;
            }
            else{
                ary[0] = 1;
                ary[1] = 0;
                rec(ary, 2, (N - 1 - pos - 1));
                for(int i = 0; i < (1 << (N - 1 - pos)); i++){
                    ans[sz++] = upper | ary[i];
                    // cout << ans[sz-1]<<endl;
                }
                // return 0;
                // 次に、現在の場所を1にして、その上で計算を行う
                upper |= (1 << (N - 1 - pos));
                pos++;
            }
        }

        cout << "YES" << endl;
        // for(int i = 0; i < sz; i++){
        //     cout << ans[i] << ",";
        // }cout<<endl;
        // 最後に得られた数列を元に戻す
        for(int i = 0; i < sz; i++){
            int before = 0;
            int after = ans[i];
            for(int j = 0; j < N; j++){
                if((after >> j) & 1){
                    before |= (1 << ord[j]);
                }
                else{
                    before &= ~(1 << ord[j]);
                }
            }
            // cout << before << ":" << after << endl;
            cout << (before ^ A) << " ";
        }
        cout << endl;
    }
    else{
        cout << "NO" << endl;
    }

    return 0;
}


Measured memory_bytes: 5632