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 Java8 (OpenJDK 1.8.0) (judge verdict: Wrong Answer)


import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;

public class Main {

    int n, a, b;
    ArrayList<Integer> ans;

    void run() {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        a = sc.nextInt();
        b = sc.nextInt();

        if (Integer.bitCount(a^b) % 2 == 0) {
            System.out.println("NO");
            return;
        }
        System.out.println("YES");
        ans = new ArrayList<>();

        solve(a, b, (1 << n) - 1);

        boolean check = true;
        for (int i = 0; i < (1 << n) - 1; i++) {
            System.out.print(ans.get(i) + " ");
            if (Integer.bitCount(ans.get(i)^ans.get(i + 1)) != 1) {
                debug(i);
            }
        }
        System.out.println(b);
    }

    void reverse(int[] ar, int l, int r) {
        int c = (l + r) / 2 - l;
        for (int i = 0; i < c; i++) {
            int tmp = ar[l + i];
            ar[l + i] = ar[r - i];
            ar[r - i] = tmp;
        }
    }

    void solve(int A, int B, int mask) {
//        debug(Integer.toBinaryString(A), Integer.toBinaryString(B), mask);

        if (Integer.bitCount(mask) == 1) {
            ans.add(A);
            ans.add(B);
            return;
        }

        int div = -1;
        for (int i = 0; i < n; i++) if ((((A ^ B) & mask) & (1 << i)) > 0) {
            div = i;
        }
        mask ^= 1 << div;

        int c = -1;
        for (int i = 0; i < n; i++) if (((~(A ^ B) & mask) & (1 << i)) > 0) {
            c = i;
        }
        int C = A ^ (1 << c);
        solve(A, C, mask);
        solve(C^ (1 << div), B, mask);
    }

    void debug(Object...os) {
        System.err.println(Arrays.deepToString(os));
    }

    public static void main(String[] args) {
        new Main().run();
    }
}