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

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

6÷2(1+2)

시간 제한8초메모리 제한512 MB

요약
주어진 식을 임의의 순서로 계산할 때 나올 수 있는 서로 다른 정수 결과의 개수를 구한다. 나눗셈은 0 방향으로 버림하고, 0으로 나누는 경우는 계산이 무효가 된다.
난이도

어려움10점 중 8점

유형
동적 계획법, 완전 탐색, 수학, 구현
정답자
아직 제출이 없습니다

문제

수학과 학생인 키타마사 군은 수학은 아주 잘하지만 산수는 그다지 잘하지 못한다. 특히 연산자 우선순위를 어려워해서, 괄호 안을 먼저 계산해야 한다는 것은 알지만 "+"와 "*" 중 어느 쪽을 먼저 계산해야 하는지, 또 여러 연산자가 나열되어 있을 때 왼쪽부터 계산해야 하는지 오른쪽부터 계산해야 하는지 기억하지 못하고, 그때그때 기분에 따라 마음대로 순서를 정해 계산한다. 예를 들어 "1*1-1+1"이라는 수식을 앞에서부터 "((1*1)-1)+1" 순서로 계산할 때도 있고, 가운데부터 "(1*(1-1))+1" 순서로 계산할 때조차 있다. 또한 분수나 소수도 어려워해서, 나눗셈에서는 항상 절댓값이 작은 쪽으로 내림하여 소수부를 버리고 정수로 만든다. 나누는 수가 0이면 키타마사 군은 어딘가에서 틀렸다고 생각하고 처음부터 다시 계산한다.

키타마사 군은 어떤 순서로 계산하더라도 최종 계산 결과는 같다고 주장한다. 당신은 그것이 틀렸음을 보이기 위해, 주어진 수식에 대해 키타마사 군의 계산 결과가 몇 가지 나올 수 있는지 구하는 프로그램을 작성해야 한다. 계산 순서가 달라도 최종 답이 같으면 하나로 세며, 주어지는 수식에는 적어도 하나는 0으로 나누지 않는 연산 순서가 존재하고, 어떤 연산 순서로 계산하더라도 계산 결과와 중간에 나타나는 수의 절댓값은 항상 10^9 이하임이 보장된다.

입력

입력은 하나 이상의 줄로 이루어지며, 각 줄에는 수식 하나가 들어 있다. 수식의 문법은 다음 BNF로 주어진다.

<expr> ::= <num>
        | "(" <expr> ")"
        | <expr> "+" <expr>
        | <expr> "-" <expr>
        | <expr> "*" <expr>
        | <expr> "/" <expr>
<num> ::= <digit> | <num> <digit>
<digit> ::= "0" | "1" | "2" | "3" | "4"
          | "5" | "6" | "7" | "8" | "9"

모든 수식은 이 문법 규칙을 따른다. 입력 줄의 길이는 200자를 넘지 않는다. 한 수식이 포함하는 연산자("+", "-", "*", "/")의 수는 10개를 넘지 않는다.

입력의 끝은 "#" 하나만으로 이루어진 줄로 나타낸다.

출력

각 수식에 대해 키타마사 군의 계산 결과가 몇 가지 나올 수 있는지 출력한다. 출력은 수식 하나마다 1줄로 한다.

예제1

  1. 예제 1

    입력
    6/2*(1+2)
    1-1-1
    (1-1-1)/2
    #
    
    예상 출력
    2
    2
    1