로그 집합 (스몰)
시간 제한5초메모리 제한512 MB
모든 부분집합 합 빈도에서 원래 정수 다중집합을 복원하고 동률은 정렬 순서가 앞선 것으로 정합니다.
문제
집합 의 멱집합은 의 모든 부분집합을 모은 것이다. 공집합과 자신도 포함한다. 집합에서 멱집합을 만들기는 쉽지만, 이 문제에서는 반대 방향으로 간다.
정수로 이루어진 다중집합 에서 출발한다. 원소가 서로 달라야 할 필요는 없다. 의 부분집합을 모두 구한 다음 각 부분집합을 그 부분집합의 원소 합으로 바꾸면 새로운 다중집합 이 나온다. 예를 들어 이면 부분집합은 , , , 이고, 따라서 이다. 에는 같은 값이 여러 번 들어갈 수 있어서, 의 원소가 개면 의 원소는 언제나 정확히 개다.
에 들어 있는 값과 각 값의 등장 횟수가 주어진다. 원래의 를 복원하라. 그런 는 반드시 존재한다. 같은 을 만드는 다중집합이 여럿이면 그중 가장 앞서는 것이 답이다. 크기가 같은 두 다중집합 과 중 어느 쪽이 앞서는지는 각각을 비내림차순으로 정렬한 뒤 값이 처음으로 달라지는 자리를 보고 정한다. 그 자리의 값이 더 작은 쪽이 앞선다.
입력
첫째 줄에 테스트 케이스의 개수 가 주어진다. 각 테스트 케이스는 세 줄이다. 첫 줄에 정수 가 주어지고, 다음 두 줄에는 각각 개의 정수가 공백으로 구분되어 주어진다. 앞의 줄은 에 등장하는 서로 다른 값 를 오름차순으로 나열한 것이고, 뒤의 줄은 각 값이 등장하는 횟수 다. 즉 값 는 에 번 들어 있다.
제한
- 의 원소 개수는 1개 이상 20개 이하다. 따라서 는 2의 거듭제곱이다.
출력
각 테스트 케이스마다 한 줄에 Case #x:를 출력하고 (는 1부터 시작하는 테스트 케이스 번호), 이어서 원래 다중집합 의 원소를 비내림차순으로 공백 한 칸씩 띄워 출력한다. 입력처럼 값과 횟수를 두 줄로 나누지 말고 의 원소를 그대로 나열한다.