Dart-a-Mania
시간 제한1초메모리 제한512 MB
301 다트 게임에서 시작 점수가 주어질 때, 세 번의 다트(각각 0, 1~20, 더블, 트리플, 불스아이 50)로 정확히 0을 만드는 조합의 수와 순열의 수를 센다.
문제
다트 게임에는 여러 가지 변형이 있다. 그중 하나는 301 게임이다. 301 게임에서 각 플레이어는 301점으로 시작한다(이름도 여기서 나왔다). 플레이어는 자기 차례에 다트를 세 개 던져 얻은 점수를 현재 점수에서 뺀다. 예를 들어 현재 점수가 272인 플레이어가 다트 세 개로 55점을 얻으면 새 점수는 217이 된다. 던진 다트는 다트판에서 1부터 20까지 번호가 붙은 영역에 맞을 수 있다. (값 0은 다트판을 완전히 벗어났거나 다트를 던지지 않기로 했음을 뜻한다.) 이 영역 중 하나에 맞은 다트는 적힌 수만큼, 적힌 수의 두 배만큼, 또는 적힌 수의 세 배만큼 점수를 낸다. 예를 들어 17이 적힌 영역에 맞은 다트 하나로 17점, 34점, 51점을 얻을 수 있다. 다트 하나로 점수를 얻는 세 번째 방법은 불스아이를 맞히는 것이며 50점이다. (불스아이 점수를 두 배 또는 세 배로 하는 규칙은 없다.)
점수를 정확히 0으로 만든 첫 번째 플레이어가 이긴다. 현재 점수보다 많은 점수를 얻으면 "버스트"라고 하며, 새 점수는 직전 점수로 되돌아간다.
플레이어의 현재 점수가 주어졌을 때, 다트 세 개를 던져 플레이어의 점수를 정확히 0으로 만드는(즉 게임에서 이기는) 모든 조합과 순열을 계산하는 프로그램을 작성하라. 프로그램의 출력에는 찾은 조합의 수와 순열의 수가 들어가야 한다.
예를 들어 현재 점수가 2라면 조합은 두 가지, 순열은 여섯 가지다. 조합은 1) 다트 하나로 2점을 얻고 나머지 둘로 0점을 얻는 경우, 2) 서로 다른 다트 두 개로 1점씩 얻고 세 번째 다트로 0점을 얻는 경우다. 얻는 순서는 중요하지 않다.
순열에서는 순서가 중요하다. 따라서 여섯 가지 순열은 다음과 같다.
(참고: 프로그램은 실제 순열과 조합을 출력하지 않고 각각의 총개수만 출력한다.)
입력
입력은 여러 플레이어의 현재 점수를 나타내는 정수(각각 999 이하)의 목록이며 한 줄에 하나씩 주어진다. 0 이하의 값은 입력의 끝을 뜻한다.
출력
입력의 각 양의 정수마다 출력에 2줄 또는 3줄이 쓰인다.
점수를 0으로 만들 수 있으면 다음 줄을 출력한다.
NUMBER OF COMBINATIONS THAT SCORES x IS c.
NUMBER OF PERMUTATIONS THAT SCORES x IS p.
여기서 x는 플레이어의 점수이고, c와 p는 각각 가능한 조합의 총개수와 순열의 총개수다.
플레이어의 점수를 0으로 만드는 것이 불가능하면 다음 줄을 출력한다.
THE SCORE OF x CANNOT BE MADE WITH THREE DARTS.
위 줄(들)을 출력한 뒤, 서로 다른 점수의 출력을 구분하기 위해 별표 70개로 이루어진 줄을 출력한다. 출력의 끝에는 "END OF OUTPUT"이라는 메시지가 나와야 한다.