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 OCaml (4.02.3) (judge verdict: Wrong Answer)

let popcnt x =
  let x = (x land 0x5555555555555555) + ((x lsr 1) land 0x5555555555555555) in
  let x = (x land 0x3333333333333333) + ((x lsr 2) land 0x3333333333333333) in
  let x = (x land 0x0f0f0f0f0f0f0f0f) + ((x lsr 4) land 0x0f0f0f0f0f0f0f0f) in
  let x = (x land 0x00ff00ff00ff00ff) + ((x lsr 8) land 0x00ff00ff00ff00ff) in
  let x = (x land 0x0000ffff0000ffff) + ((x lsr 16) land 0x0000ffff0000ffff) in
  (x land 0x00000000ffffffff) + ((x lsr 32) land 0x00000000ffffffff)

let rec gray_of_binary g = g lxor (g lsr 1)

let rec binary_of_gray b = function
  | 0 -> b
  | g -> binary_of_gray (b lxor g) (g lsr 1)
let binary_of_gray = binary_of_gray 0

let () = Scanf.scanf "%d %d %d" @@ fun n a b ->
  let a' = binary_of_gray a in
  let b' = binary_of_gray b in
  let n' = 1 lsl n in
  if popcnt (a lxor b) <> 1
  then print_endline "NO"
  else begin
    print_endline "YES";
    for i = 0 to n' - 1 do
      Printf.printf "%d " @@
      if (a' < b') = (abs (a' - b') = 1)
      then gray_of_binary ((a' + n' - i) mod n')
      else gray_of_binary ((a' + i) mod n')
    done;
    print_newline ()
  end