분할하기
시간 제한0.5초메모리 제한512 MB
집합 {0,...,2^N-1}을 크기 K와 2^N-K인 두 부분집합으로 나누되 각각이 비트 OR에 대해 닫혀 있도록 하는 분할이 존재하는지 판정하고, 존재하면 하나를 출력한다.
문제
집합 에 대하여, 가 성립할 때, 그리고 그럴 때에만 를 좋은 집합이라고 한다. 여기서 는 Bitwise-or를 의미한다. 예를 들어 은 좋은 집합이다. , , 이 모두 의 원소이기 때문이다. 다만 이므로 는 좋은 집합이 아니다.
전체 집합 의 부분집합 에 대하여, 의 원소 개수가 이고 와 가 모두 좋은 집합일 때, 그리고 그럴 때에만 를 -분할이라고 한다.
과 가 주어질 때, -분할이 존재하는지 밝히고, 존재한다면 그 예를 출력하는 프로그램을 작성하시오.
입력
첫 번째 줄에 자연수 과 가 사이에 공백을 두고 주어진다.
출력
-분할이 존재하지 않으면 첫 번째 줄에 NO를 출력한다.
-분할이 존재하면 첫 번째 줄에 YES를 출력한다. 또한 두 번째 줄에 -분할인 집합의 원소를 오름차순으로 출력한다.
-분할인 집합이 여러 개 존재하면 아무거나 출력해도 정답으로 인정된다.
제한
모든 입력 데이터는 다음 조건을 만족한다.