#agc031c. [agc031_c]Differ by 1 Bit

[agc031_c]Differ by 1 Bit

题目描述

给定整数 NNAABB。判断是否存在一个排列 (P0,P1,...,P2N1)(P_0, P_1, ..., P_{2^N-1}),满足以下条件,并创建一个满足条件的排列。

  • P0=AP_0=A
  • P2N1=BP_{2^N-1}=B
  • 对于所有 0i<2N10 \leq i < 2^N-1PiP_iPi+1P_{i+1} 的二进制表示中仅有一个位不同。

约束条件

  • 1N171 \leq N \leq 17
  • 0A2N10 \leq A \leq 2^N-1
  • 0B2N10 \leq B \leq 2^N-1
  • ABA \neq B
  • 输入中的所有值都是整数。

输入

输入通过标准输入给出,格式如下:

NN AA BB

输出

如果不存在满足条件的排列,打印 NO

如果存在满足条件的排列,第一行打印 YES。然后,第二行打印 (P0,P1,...,P2N1)(P_0, P_1, ..., P_{2^N-1}),之间用空格隔开。如果有多个解,任何一个都可以接受。

示例输入 1

2 1 3

示例输出 1

YES
1 0 2 3

排列 P=(1,0,2,3)P=(1,0,2,3) 的二进制表示为 (01,00,10,11)(01,00,10,11),其中任意相邻的元素恰好有一个不同的位。

示例输入 2

3 2 1

示例输出 2

NO