만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

숫자 마술 알아맞히기

시간 제한5초메모리 제한1536 MB

요약
관측된 K개 부분집합 곱으로부터 사후 점수를 최대화하는 2부터 M까지 N개 수의 멀티셋을 사전 순으로 가장 작게 구합니다.
난이도

보통10점 중 7점

유형
완전 탐색, 조합론, 확률
정답자
아직 제출이 없습니다

문제

마리암과 페이링은 숫자 마술을 연습한다.

마리암은 먼저 2 이상 MM 이하의 정수 NN개를 서로 독립적으로 균등하게 뽑아 카드 NN장에 하나씩 적는다. 같은 수가 여러 번 나올 수 있다. 그다음 아래 과정을 KK번 반복한다. 카드 NN장을 각각 확률 1/21/2로 독립적으로 골라 부분집합을 만들고, 고른 카드에 적힌 수의 곱을 적어 둔다. 한 장도 고르지 않았다면 곱은 1이다.

마리암은 이렇게 얻은 곱 KK개와 NN, MM을 페이링에게 알려 준다. 페이링은 숨겨진 수 NN개를 맞혀야 한다.

페이링이 항상 맞힐 수는 없다. 곱이 모두 1이면 숨겨진 수에 관한 정보가 하나도 없다. 그래서 페이링은 자기가 본 곱을 바탕으로 가장 그럴듯한 수 NN개의 모음을 답한다. 프로그램은 서로 독립인 곱 묶음 RR개마다 그 답을 정확히 계산해야 한다.

수식으로 정리하면 이렇다. AA를 2 이상 MM 이하의 정수 NN개로 이루어진 중복집합이라 하자.

  • W(A)W(A)는 중복집합이 AA가 되는 순서 있는 NN-튜플의 개수이다. AA에서 vv가 fvf_v번 나온다면 W(A)=N!/∏v=2Mfv!W(A) = N! / \prod_{v=2}^{M} f_v!이다.
  • cA(p)c_A(p)는 카드에 AA가 적혀 있을 때 곱이 pp인 부분집합의 개수이다. 부분집합은 모두 2N2^N개이고, 적힌 수가 같아도 카드는 서로 구별한다.

한 묶음의 곱이 P1,…,PKP_1, \dots, P_K일 때 AA의 점수는 다음과 같다.

S(A)=W(A)×∏j=1KcA(Pj)S(A) = W(A) \times \prod_{j=1}^{K} c_A(P_j)

S(A)S(A)는 그 곱을 관측했을 때 숨겨진 중복집합이 AA일 사후확률에 비례한다. 따라서 그 묶음의 답은 S(A)S(A)를 최대로 만드는 AA이다. 최댓값에 이르는 AA가 여럿일 수 있으므로, 원소를 오름차순으로 늘어놓은 문자열이 사전순으로 가장 앞서는 것을 고른다.

입력

첫째 줄에 테스트 케이스의 수 TT가 주어진다. TT는 항상 1이다.

둘째 줄에 정수 RR, NN, MM, KK가 공백으로 구분되어 주어진다.

이어지는 RR개의 줄에는 한 묶음의 곱 KK개가 공백으로 구분되어 주어진다.

제한

  • T=1T = 1
  • 1≤R≤1001 \le R \le 100
  • 1≤N≤121 \le N \le 12
  • 2≤M≤82 \le M \le 8
  • 1≤K≤121 \le K \le 12
  • 주어지는 곱은 모두 1 이상 MNM^N 이하이다.
  • 묶음마다 모든 jj에 대하여 cA(Pj)≥1c_A(P_j) \ge 1을 만족하는 중복집합 AA가 적어도 하나 있다. 즉 점수가 양수인 후보가 항상 존재한다.

출력

"Case #1:"을 첫째 줄에 출력한다.

이어서 RR개의 줄을 출력한다. ii번째 줄에는 ii번째 묶음의 답, 곧 S(A)S(A)가 최대인 중복집합 가운데 사전순으로 가장 앞서는 것을 숫자 NN개로 출력한다. 숫자는 오름차순으로 붙여 쓰고 사이에 공백을 넣지 않는다. 각 숫자는 2 이상 MM 이하이다. M<10M < 10이므로 숨겨진 수는 모두 한 자리이다.

예제2

  1. 예제 1

    입력
    1
    2 3 4 4
    9 4 36 1
    1 1 1 1
    
    예상 출력
    Case #1:
    334
    234
    
  2. 예제 2

    입력
    1
    3 4 5 3
    6 10 1
    6 6 36
    2 5 12
    
    예상 출력
    Case #1:
    2235
    2233
    2235