Problem:
Score : 800 points

Problem Statement

You are given integers N,\ A and B.
Determine if there exists a permutation (P_0,\ P_1,\ ...\ P_{2^N-1}) of (0,\ 1,\ ...\ 2^N-1) that satisfies all of the following conditions, and create one such permutation if it exists.

P_0=A

P_{2^N-1}=B

For all 0 \leq i < 2^N-1, the binary representations of P_i and P_{i+1} differ by exactly one bit.

Constraints

1 \leq N \leq 17

0 \leq A \leq 2^N-1

0 \leq B \leq 2^N-1

A \neq B

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N A B

Output

If there is no permutation that satisfies the conditions, print NO.

If there is such a permutation, print YES in the first line.
Then, print (P_0,\ P_1,\ ...\ P_{2^N-1}) in the second line, with spaces in between.
If there are multiple solutions, any of them is accepted.

Sample Input 1

2 1 3

Sample Output 1

YES
1 0 2 3

The binary representation of P=(1,0,2,3) is (01,00,10,11), where any two adjacent elements differ by exactly one bit.

Sample Input 2

3 2 1

Sample Output 2

NO

Solution in C++14 (GCC 5.4.1) (judge verdict: Accepted)

#include <iostream>
#include <fstream>
#include <cstdio>
#include <cmath>
#include <vector>
#include <cstring>
#include <string>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <deque>
#include <bitset>
#include <algorithm>
#include <complex>
using namespace std;
 
#define REP(i,n) for(int i=0; i<n; ++i)
#define FOR(i,a,b) for(int i=a; i<=b; ++i)
#define FORR(i,a,b) for (int i=a; i>=b; --i)
#define ALL(c) (c).begin(), (c).end()
 
typedef long long ll;
typedef vector<int> VI;
typedef vector<ll> VL;
typedef vector<VI> VVI;
typedef vector<VL> VVL;
typedef pair<int,int> P;
typedef pair<ll,ll> PL;

int in() { int x; scanf("%d", &x); return x; }
ll lin() { ll x; scanf("%lld", &x); return x; }

VI bin(int x, int n){
    VI ret(n);
    REP(i,n){
        ret[i] = x % 2;
        x /= 2;
    }
    return ret;
}

int count(int x){
    int ret = 0;
    while (x){
        ret += (x % 2);
        x /= 2;
    }
    return ret;
}

void make(int a, int b, int n, VI &ans){
    if (n == 1){
        if (a == 0){
            ans.push_back(0);
            ans.push_back(1);
        }else{
            ans.push_back(1);
            ans.push_back(0);
        }
        return;
    }
    if (a != 0){
        make(0, a ^ b, n, ans);
        REP(i,1<<n) ans[i] ^= a;
        return;
    }
    if (b & (1 << (n - 1))){
        VI tmp;
        make(0, 1, n - 1, ans);
        make(1, b - (1 << (n - 1)), n - 1, tmp);
        for (int x : tmp) ans.push_back(x + (1 << (n - 1)));
    }else{
        VI v1, v2;
        make(0, b, n - 1, v1);
        int p = v1[(1 << (n - 1)) - 2];
        make(p, b, n - 1, v2);
        REP(i,(1<<(n-1))-1) ans.push_back(v1[i]);
        for (int x : v2) ans.push_back(x + (1 << (n - 1)));
        ans.push_back(v1.back());
    }
}

int main() {
    int n, a, b;
    cin >> n >> a >> b;

    VI ba = bin(a, n), bb = bin(b, n);
    int d = 0;
    REP(i,n) d += (ba[i] != bb[i]);

    if (d % 2 == 0){
        cout << "NO" << endl;
        return 0;
    }

    VI ans;
    make(a, b, n, ans);
    cout << "YES" << endl;
    for (int x : ans) printf("%d ", x);
    cout << endl;

    return 0;
}