스로르 왕의 황금 분배
시간 제한1초메모리 제한128 MB
서로 다른 k개의 막대 값을 골라 합이 T가 되는 경우의 수를 세고, 해가 20개 이하이면 모든 해를 사전순으로 출력한다.
문제
드워프 왕 스로르는 가장 뛰어난 전사 명에게 자신의 금괴 일부를 상으로 주려고 합니다. 드워프의 화폐 단위는 미리안(Mirian)입니다. 스로르는 값이 서로 다른 금괴 개를 가지고 있으며, 각 금괴의 가치는 미리안입니다. 그는 가치의 합이 정확히 목표액 미리안이 되도록 금괴 개를 나누어 주려고 합니다. 전사들의 공로가 저마다 달라 각자 받는 금괴의 값도 대체로 서로 다릅니다.
스로르는 동생 프로르에게, 목표액 를 서로 다른 금괴 정확히 개의 가치의 합으로 나타내는 서로 다른 방법이 몇 가지인지 세어 달라고 부탁합니다.
예를 들어 금괴가 개이고 일 때, 개를 나누어 목표액 을 만드는 방법은 네 가지입니다.
, , , .
같은 목표액에서 전사가 명이면 방법은 두 가지뿐입니다.
, .
목표액 , 전사 수 , 금괴 값 이 주어질 때, 에서 서로 다른 값 정확히 개를 골라 합이 가 되는 서로 다른 방법의 수를 구하는 프로그램을 작성하세요. 방법의 수가 20 이하이면 모든 방법을 사전순 오름차순으로도 출력해야 합니다. 즉 가장 작은 금괴를 사용하는 방법을 먼저, 그중에서는 그다음으로 작은 금괴를 사용하는 방법을 먼저 나열하는 식입니다. 한 방법 안에서 값들은 오름차순으로 출력합니다.
입력
첫 줄에 테스트 케이스의 수 가 주어집니다(). 각 테스트 케이스의 형식은 다음과 같습니다.
- 목표액 와 전사 수 가 공백으로 구분되어 한 줄에 주어집니다(, ).
- 금괴의 개수 이 한 줄에 주어집니다().
- 금괴 개의 값 이 주어집니다. 모두 서로 다른 양의 정수이며 강한 오름차순으로 정렬되어 있습니다. (여러 줄에 걸쳐 주어질 수 있습니다.)
방법의 수는 부호 있는 64비트 정수에 들어가도록 보장됩니다(즉 미만입니다).
출력
각 테스트 케이스마다 주어진 순서대로 다음 블록을 출력합니다.
Test case X
Target sum = T
Number of warriors = k
V = {v1, v2, ..., vn}
Number of solutions = C
여기서 X는 1부터 시작하는 테스트 케이스 번호이고, T, k, 금괴 값들은 입력을 그대로 옮긴 것입니다(중괄호 안의 값들은 쉼표와 공백으로 구분합니다). C는 목표액을 만드는 방법의 수입니다. Target sum, Number of warriors, V = {...} 줄은 각각 맨 앞에 공백 한 칸으로 시작하고, Number of solutions 줄은 그렇지 않습니다.
C가 20 이하이면 각 방법을 사전순 오름차순으로 한 줄씩 추가로 출력합니다. 각 줄은 맨 앞에 공백 한 칸으로 시작하고, 이어서 선택한 개의 값을 오름차순으로 공백 한 칸씩 구분하여 출력합니다.
이웃한 테스트 케이스 사이에는 빈 줄을 하나 출력합니다.