시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
0.5 초 (추가 시간 없음) 512 MB 54 31 29 65.909%

문제

집합 $S$에 대하여, "$a,b \in S \Longrightarrow (a | b) \in S$"가 성립한다면 (또한 그러할 때에만) "$S$가 좋은 집합이다"라고 정의하자. 여기서 '$|$'는 Bitwise-or를 의미한다. 예를 들어, {1, 3}은 좋은 집합이다. (1|1) = 1, (1|3) = 3, (3|3) = 3은 모두 {1, 3}의 원소기 때문이다. 다만, (1|2) = 3이므로 {1, 2}는 좋은 집합이 아니다.

전체 집합 $U = \{ 0, 1, \cdots, 2^N - 1 \}$의 부분집합 $A$에 대하여, "$A$의 원소의 개수가 $K$고, $A$와 $(U \setminus A)$가 모두 좋은 집합"이면 (또한 그러할 때에만) $A$를 "$N, K$-분할"이라고 한다.

$N$과 $K$가 주어질 때, "$N, K$-분할"이 존재하는지 밝히고, 있다면 그러한 예를 출력하는 프로그램을 작성하시오.

입력

첫번째 줄에 자연수 $N$과 $K$가 사이에 공백을 두고 주어진다.

출력

만약 "$N, K$-분할"이 존재하지 않다면 첫번째 줄에 "NO"를 출력한다.

만약 "$N, K$-분할"이 존재한다면 첫번째 줄에 "YES"를 출력한다. 또한 두번째 줄에 "$N, K$-분할"인 집합의 원소를 오름차순으로 출력한다.

"$N, K$-분할"인 집합이 여러 개 존재한다면, 아무거나 출력해도 정답으로 인정된다.

제한

모든 입력 데이터는 다음 조건을 만족한다.

  • $1 \le N \le 12$
  • $1 \le K \le 2^N$

예제 입력 1

1 1

예제 출력 1

YES
0

예제 입력 2

2 4

예제 출력 2

YES
0 1 2 3

예제 입력 3

3 3

예제 출력 3

YES
1 4 5

예제 입력 4

3 5

예제 출력 4

YES
0 2 3 6 7