output_description: 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.
  
  * * *
input_description: Input is given from Standard Input in the following format:
  
      
      
      N A B
attempt: n, a, b = map(int, input().split())
  
  if bin(a).count("1") % 2 == bin(b).count("1") % 2:
      print("NO")
      exit()
  
  # グレイコードのリスト生成
  gray = [0] * (1 << n)
  for i in range(1 << n):
      gray[i] = i ^ (i >> 1)
  
  # グレイコードリストでのa, bの位置探索
  ind_a, ind_b = -1, -1
  for i in range(1 << n):
      if gray[i] == a:
          ind_a = i
      if gray[i] == b:
          ind_b = i
  if ind_a > ind_b:
      ind_a, ind_b = ind_b, ind_a
  
  # a->b までの距離と b->a までの距離でより長い方をベースに使う
  res1 = [gray[i] for i in range(ind_a, ind_b + 1)]
  res2 = [gray[i] for i in range(ind_b, len(gray))] + [
      gray[i] for i in range(0, ind_a + 1)
  ]
  if len(res1) > len(res2):
      res = res1[0:]
      nokori = res2[1:-1]
  else:
      res = res2[0:]
      nokori = res1[1:-1]
  
  # 余ったほうをベースに加えるための整理（cnt1で分類）
  nokori_memo = {}
  for i in range(0, len(nokori), 2):
      tmp = nokori[i : i + 2]
      cnt0 = bin(tmp[0]).count("1")
      cnt1 = bin(tmp[1]).count("1")
      if (cnt0, cnt1) not in nokori_memo:
          nokori_memo[cnt0, cnt1] = []
      nokori_memo[cnt0, cnt1].append(tmp)
  
  # ベースとあまりをマージ
  ans = []
  while res:
      num = res.pop()
      ans.append(num)
      num = bin(num).count("1")
      while (num + 1, num) in nokori_memo and nokori_memo[(num + 1, num)]:
          tmp = nokori_memo[(num + 1, num)].pop()
          ans.append(tmp[0])
          ans.append(tmp[1])
      while (num - 1, num) in nokori_memo and nokori_memo[(num - 1, num)]:
          tmp = nokori_memo[(num - 1, num)].pop()
          ans.append(tmp[0])
          ans.append(tmp[1])
      while (num, num + 1) in nokori_memo and nokori_memo[(num, num + 1)]:
          tmp = nokori_memo[(num, num + 1)].pop()
          ans.append(tmp[1])
          ans.append(tmp[0])
      while (num, num - 1) in nokori_memo and nokori_memo[(num, num - 1)]:
          tmp = nokori_memo[(num, num - 1)].pop()
          ans.append(tmp[1])
          ans.append(tmp[0])
  
  print("YES")
  if ans[0] == a:
      print(*ans)
  else:
      print(*ans[::-1])
  
problem_description: 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.
samples: [{"input": "2 1 3", "output": "YES\n    1 0 2 3\n    \n\nThe binary representation of P=(1,0,2,3) is (01,00,10,11), where any two\nadjacent elements differ by exactly one bit.\n\n* * *"}, {"input": "3 2 1", "output": "NO"}]