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 Python (3.4.3) (judge verdict: Wrong Answer)

def listToString(_list, split=""):
    maped_list = map(str, _list)  # mapで要素すべてを文字列に
    mojiretu = split.join(maped_list)
    return mojiretu

def binToInt(_bin):
    out = 0
    for i in range(len(_bin)):
        out += (2**i)*_bin[i]
    return out
n, a, b = [int(i) for i in input().split()]
_a = bin(a)[2:]
_b = bin(b)[2:]
hamDis = 0
a = [int(_a[i]) for i in reversed(range(len(_a)))]
b = [int(_b[i]) for i in reversed(range(len(_b)))]
# 長さをそろえる
for i in range(len(a) - len(b)):
    b.append(0)
for i in range(len(b) - len(a)):
    a.append(0)
for i in range(min(len(a), len(b))):
    if a[i] != b[i]:
        hamDis += 1
# print("hamDis:{}".format(hamDis))
if hamDis <= 2**n-1 and (2 ** n - 1 - hamDis) % 2 == 0:
    print("YES")
    _a = binToInt(a)
    out = [_a]
    for i in range(len(a)):
        if a[i] != b[i]:
            if a[i] == 0:
                _a += 2 ** i
            else:
                _a += 2 ** i
            out.append(_a)
    margin = 2 ** n - len(out)
    tmp = 2 ** 20
    for i in range(margin):
        if i % 2 == 0:
            _a += tmp
        else:
            _a -= tmp
        out.append(_a)
    print(listToString(out, " "))
else:
    print("NO")