네가 밀어줄게(백개먼)

시간 제한1초메모리 제한128 MB

요약
6개 지점에 15개의 말을 놓는 분포를 사전순으로 정렬했을 때, 분포와 15504개 중 해당 인덱스 사이를 변환한다.
난이도

보통10점 중 5점

유형
조합론, 수학, 구현, 시뮬레이션
정답자
아직 제출이 없습니다

문제

한 친구가 백개먼(backgammon)을 두는 프로그램을 만들고 있는데, 게임이 끝났을 때의 말 배치에 번호를 매기는 방법이 필요하다. 게임이 끝나면 한 사람의 말 15개는 모두 1번부터 6번까지 번호가 붙은 6개의 자리(포인트) 위에 놓인다. 말은 포인트에 어떤 방식으로든 나뉘어 놓일 수 있다. 예를 들어 15개를 모두 3번 포인트에 둘 수도 있고, 6번에 5개, 5번에 2개, 4번에 3개, 2번에 5개를 둘 수도 있다. 이런 배치는 정확히 15504가지가 있으며, 이들을 1차원 배열에 저장하려면 각 배치와 배열 인덱스 사이의 대응이 필요하다.

배치는 각 포인트에 놓인 말의 개수를 6번 포인트부터 시작해 1번 포인트까지 차례로 나열하여 나타낸다. 예를 들어 "15개를 모두 3번 포인트에" 둔 배치는 (0,0,0,15,0,0)(0, 0, 0, 15, 0, 0)으로, "6번에 5개, 5번에 2개, 4번에 3개, 2번에 5개"인 배치는 (5,2,3,0,5,0)(5, 2, 3, 0, 5, 0)으로 표기한다.

모든 배치를 이 6-튜플의 사전식 순서로 정렬한다. 즉 6번 포인트의 개수를 먼저 비교하고, 같으면 5번 포인트의 개수를 비교하는 식이다. 따라서 순서는 (0,0,0,0,0,15)(0, 0, 0, 0, 0, 15)로 시작하여 (0,0,0,0,1,14)(0, 0, 0, 0, 1, 14), (0,0,0,0,2,13)(0, 0, 0, 0, 2, 13), ..., (0,0,0,0,14,1)(0, 0, 0, 0, 14, 1), (0,0,0,0,15,0)(0, 0, 0, 0, 15, 0), (0,0,0,1,0,14)(0, 0, 0, 1, 0, 14), (0,0,0,1,1,13)(0, 0, 0, 1, 1, 13), ... 로 이어지고 (15,0,0,0,0,0)(15, 0, 0, 0, 0, 0)으로 끝난다.

배열 인덱스는 이 순서대로 매긴다. 첫 번째 배치인 (0,0,0,0,0,15)(0, 0, 0, 0, 0, 15)(15개가 모두 1번 포인트)는 인덱스 00을, 마지막 배치인 (15,0,0,0,0,0)(15, 0, 0, 0, 0, 0)(15개가 모두 6번 포인트)은 인덱스 1550315503을 가진다. 각 질의마다 배치를 인덱스로 바꾸거나, 인덱스를 다시 배치로 되돌려야 한다.

입력

각 질의는 한 줄에 하나씩 주어지며, 문자 m 또는 u 하나로 시작한다.

  • m이면 그 뒤에 배치가 온다. 6, 5, 4, 3, 2, 1번 포인트에 놓인 말의 개수를 이 순서대로 나타내는 정수 6개이며, 그 합은 15이다. 이 배치가 대응되는 배열 인덱스를 구해야 한다.
  • u이면 그 뒤에 배열 인덱스 정수 ii가 온다(0≤i<155040 \le i < 15504). 이 인덱스에 대응되는 배치를 구해야 한다.

문자 e 하나만 있는 줄이 나오면 입력이 끝난다.

출력

각 질의마다 Case X: A 형식의 줄을 하나씩 출력한다. 여기서 XX는 질의 번호(1부터 시작하여 질의마다 1씩 증가)이고, AA는 답이다. m 질의면 배열 인덱스를, u 질의면 6, 5, 4, 3, 2, 1번 포인트의 말 개수 6개를 공백 하나로 구분하여 출력한다.

예제3

  1. 예제 1

    입력
    m 0 0 0 0 0 15
    u 15503
    e
    
    예상 출력
    Case 1: 0
    Case 2: 15 0 0 0 0 0
    
  2. 예제 2

    입력
    u 0
    e
    
    예상 출력
    Case 1: 0 0 0 0 0 15
    
  3. 예제 3

    입력
    m 0 0 0 15 0 0
    m 5 2 3 0 5 0
    e
    
    예상 출력
    Case 1: 135
    Case 2: 13121