#include <iostream>
#include <stdio.h>
#include <cstring>
#include <vector>
#include <algorithm>
#include <cstdlib>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <ctime>
#include <cassert>
#include <unordered_map>
#include <fstream>
#include <random>
#include <cstring>
#include <bitset>
#include <functional>
#include <tuple>
#include <complex>
#include <chrono>
#include <climits>

#define all(a) (a).begin(), (a).end()
#define sz(a) (int)(a).size()

using namespace std;

typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef unsigned int uint;

mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());
// default_random_engine generator;
// mt19937 rnd(1);

vector<int> solve(int n, int a, int b, int mask) {
    // cout << a << " " << b << " " << mask << endl;
    assert((a & mask) == a);
    assert((b & mask) == b);

    if (__builtin_popcount(mask) == 1) {
        assert((a ^ b) == mask);
        return {a, b};
    }
    vector<int> res;
    vector<int> bits;
    for (int i = 0; i < n; ++i) {
        if (mask & (1 << i)) {
            bits.push_back(i);
        }
    }

    for (int i : bits) {
        if ((b & (1 << i)) != (a & (1 << i)) ) {
            bool flag = false;
            if (a & (1 << i)) {
                flag = true;
                a ^= (1 << i);
                b ^= (1 << i);
            }

            int j = (i == bits[0] ? bits[1] : bits[0]);

            for (int el : solve(n, a, (1 << j) ^ a, mask ^ (1 << i))) {
                res.push_back(el);
            }
            for (int el : solve(n, (1 << j) ^ a, b ^ (1 << i), mask ^ (1 << i))) {
                res.push_back(el ^ (1 << i));
            }


            if (flag) {
                for (int k = 0; k < sz(res); ++k) {
                    res[k] ^= (1 << i);
                }
                a ^= (1 << i);
                b ^= (1 << i);
            }

            // cout << "! ";
            // for (int i = 0; i < sz(res); ++i) {
            //     cout << res[i] << " ";
            // }
            // cout << endl;

            assert(res[0] == a && res.back() == b);
            break;
        }

    }

    return res;
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    // freopen("input.txt", "r", stdin);
    // freopen("output.txt", "w", stdout);

    int n, a, b;
    cin >> n >> a >> b;

    if (__builtin_popcount(a ^ b) % 2 == 0) {
        cout << "NO" << endl;
        return 0;
    }

    vector<int> res = solve(n, a, b, (1 << n) - 1);


    assert(res[0] == a && res.back() == b);
    for (int i = 0; i < sz(res) - 1; ++i) { 
        assert(__builtin_popcount(res[i] ^ res[i + 1]) == 1);
    }

    cout << "YES" << endl;
    for (int el : res) {
        cout << el << " ";
    }
    cout << endl;


    // int k = -1;
    // for (int i = 0; i < n; ++i) {
    //     if (c == (1 << i)) {
    //         k = i;
    //     }
    // }

    // if (k == -1) {
    //     cout << "NO" << endl;
    //     return 0;
    // }

    // vector<int> arr = {0};
    // for (int i = 0; i < n; ++i) {
    //     int m = sz(arr);
    //     for (int j = m - 1; j >= 0; --j) {
    //         arr.push_back(arr[j] + m);
    //     }
    // }

    // if (k != n - 1) {
    //     for (int i = 0; i < sz(arr); ++i) {
    //         int u = (arr[i] & (1 << k)) > 0;
    //         int v = (arr[i] & (1 << (n - 1))) > 0;
    //         arr[i] |= (1 << k) | (1 << (n - 1));
    //         arr[i] ^= (1 << k) | (1 << (n - 1));
    //         arr[i] ^= v * (1 << k);
    //         arr[i] ^= u * (1 << (n - 1));
    //     }
    // }
        

    // int x = a;

    // for (int i = 0; i < sz(arr); ++i) {
    //     arr[i] ^= x;
    // }

    

    // // cout << "YES" << endl;
    // // for (int i = 0; i < sz(arr); ++i) {
    // //     cout << arr[i] << " ";
    // // }
    // // cout << endl;
        

}


Measured memory_bytes: 1648