숫자 마술 알아맞히기
시간 제한5초메모리 제한1536 MB
관측된 K개 부분집합 곱으로부터 사후 점수를 최대화하는 2부터 M까지 N개 수의 멀티셋을 사전 순으로 가장 작게 구합니다.
문제
마리암과 페이링은 숫자 마술을 연습한다.
마리암은 먼저 2 이상 이하의 정수 개를 서로 독립적으로 균등하게 뽑아 카드 장에 하나씩 적는다. 같은 수가 여러 번 나올 수 있다. 그다음 아래 과정을 번 반복한다. 카드 장을 각각 확률 로 독립적으로 골라 부분집합을 만들고, 고른 카드에 적힌 수의 곱을 적어 둔다. 한 장도 고르지 않았다면 곱은 1이다.
마리암은 이렇게 얻은 곱 개와 , 을 페이링에게 알려 준다. 페이링은 숨겨진 수 개를 맞혀야 한다.
페이링이 항상 맞힐 수는 없다. 곱이 모두 1이면 숨겨진 수에 관한 정보가 하나도 없다. 그래서 페이링은 자기가 본 곱을 바탕으로 가장 그럴듯한 수 개의 모음을 답한다. 프로그램은 서로 독립인 곱 묶음 개마다 그 답을 정확히 계산해야 한다.
수식으로 정리하면 이렇다. 를 2 이상 이하의 정수 개로 이루어진 중복집합이라 하자.
- 는 중복집합이 가 되는 순서 있는 -튜플의 개수이다. 에서 가 번 나온다면 이다.
- 는 카드에 가 적혀 있을 때 곱이 인 부분집합의 개수이다. 부분집합은 모두 개이고, 적힌 수가 같아도 카드는 서로 구별한다.
한 묶음의 곱이 일 때 의 점수는 다음과 같다.
는 그 곱을 관측했을 때 숨겨진 중복집합이 일 사후확률에 비례한다. 따라서 그 묶음의 답은 를 최대로 만드는 이다. 최댓값에 이르는 가 여럿일 수 있으므로, 원소를 오름차순으로 늘어놓은 문자열이 사전순으로 가장 앞서는 것을 고른다.
입력
첫째 줄에 테스트 케이스의 수 가 주어진다. 는 항상 1이다.
둘째 줄에 정수 , , , 가 공백으로 구분되어 주어진다.
이어지는 개의 줄에는 한 묶음의 곱 개가 공백으로 구분되어 주어진다.
제한
- 주어지는 곱은 모두 1 이상 이하이다.
- 묶음마다 모든 에 대하여 을 만족하는 중복집합 가 적어도 하나 있다. 즉 점수가 양수인 후보가 항상 존재한다.
출력
"Case #1:"을 첫째 줄에 출력한다.
이어서 개의 줄을 출력한다. 번째 줄에는 번째 묶음의 답, 곧 가 최대인 중복집합 가운데 사전순으로 가장 앞서는 것을 숫자 개로 출력한다. 숫자는 오름차순으로 붙여 쓰고 사이에 공백을 넣지 않는다. 각 숫자는 2 이상 이하이다. 이므로 숨겨진 수는 모두 한 자리이다.