분배
시간 제한1초메모리 제한512 MB
0부터 2^N-1까지 모든 정수를 보수 쌍으로 묶어 크기와 이진수 1의 개수 합이 같은 2^K개 상자에 나눠 담습니다.
문제
0 이상 이하의 정수가 하나씩, 모두 개 있다. 정수를 담는 상자는 개이고, 각 상자에는 1번부터 번까지 번호가 차례대로 붙어 있다.
이 개의 정수를 상자에 모두 나누어 담으려고 한다. 상자마다 들어가는 정수의 개수는 서로 같아야 하므로, 각 상자에는 서로 다른 정수가 개씩 들어간다. 조건이 하나 더 있다. 한 상자에 들어 있는 수를 모두 이진수로 나타낸 다음 거기에 나오는 1의 개수를 세어 더하면, 그 합이 모든 상자에서 같아야 한다.
조건을 만족하는 분배를 출력하라.
입력
첫째 줄에 자연수 과 가 공백을 사이에 두고 주어진다. ()
출력
개의 줄을 출력한다. 번째 줄 ()에는 번 상자에 들어 있는 정수 개를 공백 하나로 구분해 출력한다.
조건을 만족하는 분배는 여러 가지이므로, 이 문제에서는 그중 다음 한 가지만 정답으로 인정한다. 이라 하자. 번 상자에는 인 정수 가 들어가고, 그런 마다 의 개 비트를 모두 뒤집은 수 도 함께 들어간다. 한 상자의 수는 오름차순으로 출력한다.
힌트
, 인 경우를 보자. 1번 상자에는 0과 3이 들어간다. 0은 이진수로 0, 3은 11이므로 1의 개수의 합은 2다. 2번 상자에는 1과 2가 들어간다. 1은 이진수로 1, 2는 10이므로 이쪽도 합이 2다. 두 상자에 같은 수가 겹치지 않고 1의 개수의 합도 2로 같으므로, 이 분배는 조건을 만족한다.