친구여, 트론크 한 닢만 나눠주겠나?
시간 제한5초메모리 제한128 MB
서로 다른 단위분수 n개의 합이 정확히 1이 되는 조합을, 사용 횟수 제한과 금지된 분모 조건 아래 모두 세어 출력한다.
문제
트론(Tron)의 세계에서 쓰이는 기본 화폐 단위는 트론크(Tronk) 입니다. 트론크의 잔돈을 만드는 일은 생각보다 까다롭습니다. 미국에는 각각 1달러의 , , , , 의 가치를 가지는 하프달러, 쿼터, 다임, 니켈, 페니가 있습니다. 그러나 트론의 세계에는 모든 양의 정수의 역수에 해당하는 동전이 하나씩, 무한히 많이 존재합니다.
즉, 가장 작은 동전이라는 것이 존재하지 않습니다.
정확히 개의 동전을 사용하여 1 트론크의 잔돈을 만드는 서로 다른 방법은 몇 가지일까요? 다시 말해, 합이 정확히 이 되도록 개의 단위분수를 고르는 방법의 수를 구하는 것입니다. 예를 들어 일 때는 정확히 세 가지 방법이 있습니다.
여기에 두 가지 제약이 추가됩니다.
- 정수 이 주어집니다. 어떤 동전도 번을 초과하여 사용할 수 없습니다. 예를 들어 이면 위의 첫 번째 조합은 더 이상 유효하지 않지만 나머지 두 조합은 여전히 유효합니다. 이면 각 동전을 원하는 만큼 사용할 수 있습니다.
- 정수 목록 가 주어집니다. 이 목록에 있는 값의 역수 는 사용할 수 없습니다. 예를 들어 이면 과 을 쓸 수 없으므로 위에서는 첫 번째 조합만 유효합니다.
보고하는 모든 조합은 정확해야 합니다. 부동소수점 오차와 매우 작은 동전(예: ) 때문에 동전들의 합이 에 임의로 가깝게 다가갈 수는 있지만, 합이 정확히 이 아니라면 그 조합은 틀린 것입니다.
입력
첫 번째 줄에는 테스트 케이스의 수 () 가 주어집니다. 이어지는 개의 줄에는 각각 하나의 테스트 케이스가 다음 순서로 주어집니다.
- — 반드시 사용해야 하는 동전의 개수 ();
- — 반복 사용 한도 ( 이면 각 동전을 원하는 만큼 사용할 수 있음);
- — 금지된 동전의 수 ();
- — 금지된 동전들.
어떤 유효한 조합도 보다 작은 동전을 필요로 하지 않는다고 가정해도 됩니다. 즉, 등장할 수 있는 모든 분모는 이하입니다.
출력
각 테스트 케이스에 대해 다음 형식으로 결과를 출력합니다.
먼저 머리글 줄을 출력합니다.
Case i : Number of coins = n; Repetitions = r; Forbidden = [f_1 f_2 ... f_k]
여기서 는 부터 시작하는 테스트 케이스 번호이며, 금지된 동전은 입력에서 주어진 순서대로 나열합니다(없으면 빈 대괄호 [] 를 씁니다).
그다음 유효한 각 조합을 한 줄에 하나씩 출력합니다. 한 줄 안에서는 동전의 분모를 비내림차순으로 공백 하나로 구분하여 나열합니다. 예를 들어 집합 는 2 3 6 으로 씁니다. 조합들은 분모 수열을 앞에서부터 원소별로 비교하는 사전식 오름차순으로 나열해야 합니다.
마지막으로 유효한 조합의 개수 에 대해 C solutions found 줄을 출력합니다. 유효한 조합이 하나도 없으면 조합 줄 없이 No solutions found 를 대신 출력합니다.