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: Accepted)

import java.util.*;
import java.io.*;

public class Main {

    static void impossible(){
        System.out.println("NO");
        System.exit(0);
    }

    static int[] answer(int N, int end){// route of 0 -> end
        //assert bitCount(end) is odd
        if(N==1) return new int[]{0, 1};
        if(N==2){
            switch(end){
                case 1: return new int[]{0,2,3,1};
                default: return new int[]{0,1,3,2};
            }
        }

        int[] ans = new int[1 << N];
        if((end&(1<<(N-1)))==0){
            int[] smaller = answer(N-1, end);
            for(int i=0; i<smaller.length; i++){
                if((i&1)==0){
                    ans[2*i] = smaller[i];
                    ans[2*i+1] = smaller[i] | (1<<(N-1));
                }else{
                    ans[2*i] = smaller[i] | (1<<(N-1));
                    ans[2*i+1] = smaller[i];
                }
            }
            return ans;
        }else{
            int[] smaller1 = answer(N-1, 1);
            for(int n=0; n<(1<<(N-1)); n++) ans[n]=smaller1[n];
            int[] smaller2 = answer(N-1, end^(1<<(N-1))^1);
            for(int n=0; n<(1<<(N-1)); n++) ans[(1<<(N-1))+n]=smaller2[n] ^ (1<<(N-1)) ^ 1;
            return ans;
        }
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int A = sc.nextInt();
        int B = sc.nextInt();
        if(Integer.bitCount(A^B) %2 ==0) impossible();

        System.out.println("YES");
        int[] ans = answer(N, A^B);
        for(int i=0; i<ans.length; i++) ans[i] ^= A;
        for(int i=0; i<ans.length; i++){
            System.out.print(ans[i]);
            if(i==ans.length-1) System.out.println();
            else System.out.print(" ");
        }


    }
}