재비어, 세는 법을 배우다
시간 제한5초메모리 제한512 MB
서로 다른 양의 정수 m개와 크기 p(최대 5)가 주어질 때, 합으로 만들 수 있는 모든 값마다 그 합이 되는 p개 부분집합의 개수를 세어 오름차순으로 출력한다.
문제
9살 학생 재비어는 온갖 종류의 퍼즐을 좋아한다. 그중에서도 특히 좋아하는 퍼즐은 다음과 같다.
같은 반 친구 제리어가 여러 장의 카드를 만들었다. 각 카드에는 양의 정수가 하나씩 적혀 있으며, 같은 수가 적힌 카드는 없다. 그런 다음 제리어는 등식을 하나 적는다. 우변은 그녀가 고른 양의 정수 이고, 좌변은 카드 값 가운데 개의 합이다.
재비어는 자리에 카드 장을 놓아 이 등식을 성립시켜야 한다. 이때 고른 값은 작은 것부터 큰 것 순서로 놓아야 한다는 조건이 추가된다.
모든 카드의 수가 서로 다르므로, 이는 서로 다른 카드 장을 고르는 것과 같다. 고른 카드들을 오름차순으로 배열하는 방법은 정확히 한 가지다. 제리어가 고른 에 대해 재비어는 해가 몇 가지인지 알고 싶어 한다. 각 테스트 케이스에서, 만들 수 있는 모든 합 마다 그 합을 만드는 방법의 수를 구하라.
입력
여러 개의 테스트 케이스가 주어진다. 입력의 첫 줄에 테스트 케이스의 개수 가 주어진다. 이어서 각 테스트 케이스가 차례로 주어진다.
각 테스트 케이스는 두 줄로 이루어진다.
- 첫째 줄: 공백으로 구분된 두 정수 과 (). 은 카드의 개수다.
- 둘째 줄: 카드에 적힌 서로 다른 양의 정수 개. 각 값은 을 넘지 않는다.
출력
각 테스트 케이스마다 다음을 출력한다.
- 먼저
Case #x:를 출력한다. 여기서 는 부터 시작하는 테스트 케이스 번호다. - 카드 중 정확히 장을 골라 만들 수 있는 각 합 에 대해, 그 합을 만드는 방법의 수 를
n: w형식으로 한 줄에 출력한다. 합 은 오름차순으로 나열하고, 한 가지 이상의 방법으로 만들 수 있는 합만 출력한다. 그래야 출력이 유한하다. - 각 테스트 케이스 뒤에 빈 줄을 하나 출력한다.