#include <bits/stdc++.h>
using namespace std;

// n の i ビット目と j ビット目を swap する
void swp(int &n, int i, int j) {
    if ((n >> i & 1) ^ (n >> j & 1) == 0) return;
    n ^= (1 << i);
    n ^= (1 << j);
}

// [0, n) ビット目を使って a を b にする
vector<int> dfs(int n, int a, int b) {
    if (n == 1) return {a, b};

    b ^= a;
    int msb = 31 - __builtin_clz(b);
    if (b) swp(b, n - 1, msb);

    int onehot = 1 << (n - 1);
    int mask = onehot - 1;
    auto first = dfs(n - 1, 0, 1);
    auto second = dfs(n - 1, 1, b & mask);

    vector<int> res;
    for (auto x : first) res.push_back(x);
    for (auto x : second) res.push_back(x | onehot);

    for (auto& x : res) swp(x, n - 1, msb);
    for (auto& x : res) x ^= a;
    return res;
}

int main() {
    int n, a, b;
    cin >> n >> a >> b;
    if (!__builtin_parity(a ^ b)) {
        cout << "NO" << endl;
        return 0;
    }
    cout << "YES" << endl;
    auto res = dfs(n, a, b);
    for (int i = 0; i < res.size(); i++) {
        cout << res[i] << ((i == res.size() - 1) ? "\n" : " ");
    }
}
