아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

진법 표기 복원

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

요약
각 숫자열에 괄호와 붙임표를 넣어 밑이 2 이상인 유효한 십진 부호화 수로 해석하는 경우의 수를 센다.
난이도

어려움10점 중 8점

유형
동적 계획법, 조합론, 수학, 구현
정답자
아직 제출이 없습니다

문제

모든 음이 아닌 정수는 숫자들의 나열로 나타낼 수 있다. 가장 널리 쓰이는 체계는 열 개의 숫자를 사용하는 십진법(밑수 10)이다. 이 외에 다른 밑수를 쓰는 체계도 있는데, 예를 들어 컴퓨터에서는 이진법(밑수 2)이 자주 쓰인다.

일반적으로 밑수가 rr(r>1r > 1)인 체계에서 음이 아닌 정수 nn을 숫자열

dk dk−1 ⋯ d1 d0d_k\,d_{k-1}\,\cdots\,d_1\,d_0

으로 적으면, 그 값은

n=dk⋅rk+dk−1⋅rk−1+⋯+d1⋅r+d0n = d_k \cdot r^{k} + d_{k-1} \cdot r^{k-1} + \cdots + d_1 \cdot r + d_0

이다. 모든 자리의 숫자는 밑수보다 작아야 한다. 즉, 0≤i≤k0 \le i \le k인 모든 ii에 대해 0≤di<r0 \le d_i < r이다.

밑수가 10보다 크면 9를 넘는 "숫자"를 나타낼 기호가 더 필요하기 때문에 불편하다. 흔히 알파벳을 쓰지만 글자 수도 유한하므로 아주 큰 밑수는 이렇게 적을 수 없다.

또 다른 방법은 각 자리의 숫자를 그 자체로 십진수로 적는 것이다. 예를 들어 16진수 1A8D는 (1-10-8-13)16으로 적을 수 있다. 혼동을 막기 위해 (십진법이라도) 항상 밑수를 뒤에 붙인다. 이 글에서는 이 형식을 십진 부호화 표기(decimal-encoded notation) 라고 부른다.

십진 부호화 표기는 불필요한 0이 없을 때에만 올바른 표기로 인정한다. 구체적으로, 밑수나 어떤 자리의 숫자에도 불필요한 앞자리 0이 있어서는 안 되고(여러 자리로 이루어진 수의 최상위 자리는 0일 수 없고, 각 자리 숫자의 십진 표기 자체에도 앞자리 0이 없어야 하며, 밑수에도 앞자리 0이 없어야 한다), 모든 자리의 숫자는 밑수보다 작아야 한다. 예를 들어 (1-0-0-0)7, (4-7689)7690, (0)16은 올바르지만, (0-3-6)8, (1-02-3)6, (3-2-1)07, (9)6은 올바르지 않다.

이렇게 올바른 십진 부호화 표기로 저장된 수들이 파일에 담겨 있었는데, 버그로 인해 파일이 손상되었다. 십진 숫자는 모두 원래 순서 그대로 남았지만, 대시(-)와 괄호가 전부 사라졌다. 따라서 각 수는 십진 숫자만으로 이루어진 문자열이 되었고, 이런 문자열은 매우 모호해서 대부분 여러 수로 해석될 수 있다. 예를 들어 1234는 (1-2-3)4, (12)34, (1-2)34, (1)234 중 어느 것으로도 읽을 수 있다.

손상된 각 문자열에 대해, 그 문자열을 만들어 낼 수 있는 서로 다른 십진 부호화 표기가 몇 가지인지 구하여라. 두 표기는 값이 같더라도 서로 다른 것으로 센다.

입력

입력은 여러 줄로 이루어진다. 각 줄에는 코드 하나, 즉 십진 숫자로 이루어진 문자열이 주어진다. 코드의 길이는 1 이상 35 이하이다. 입력의 마지막 줄에는 해시 문자 # 하나만 주어진다.

출력

각 코드마다 한 줄을 출력한다. 그 코드를 만들어 내는 올바른 십진 부호화 표기가 하나도 없으면 The code CCC is invalid.를 출력한다. 그렇지 않으면 The code CCC can represent X numbers.를 출력한다. 이때 CCC는 주어진 코드로, X는 대시와 괄호를 지웠을 때 그 코드가 되는 서로 다른 십진 부호화 표기의 총 개수로 바꾼다. 표기는 값이 같더라도 서로 다른 것으로 센다.

예제3

  1. 예제 1

    입력
    1234
    102
    201
    123456
    #
    
    예상 출력
    The code 1234 can represent 4 numbers.
    The code 102 can represent 1 numbers.
    The code 201 is invalid.
    The code 123456 can represent 13 numbers.
    
  2. 예제 2

    입력
    5
    0
    9
    #
    
    예상 출력
    The code 5 is invalid.
    The code 0 is invalid.
    The code 9 is invalid.
    
  3. 예제 3

    입력
    012
    03
    0
    #
    
    예상 출력
    The code 012 can represent 1 numbers.
    The code 03 can represent 1 numbers.
    The code 0 is invalid.