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