만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

카드 연산 (라지)

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

요약
시작값에 산술 카드들을 원하는 순서로 적용해 얻을 수 있는 최대 유리수 결과를 기약분수로 출력한다.
난이도

어려움10점 중 8점

유형
그리디, 정렬, 수학, 완전 탐색
정답자
아직 제출이 없습니다

문제

카드로 하는 Operation이라는 놀이가 있다. 카드 한 장에는 사칙연산 중 하나인 연산 OiO_i(덧셈, 뺄셈, 곱셈, 나눗셈)와 그 연산의 오른쪽 피연산자인 정수 ViV_i가 적혀 있다. + 0, - -2, / -4 같은 카드가 나올 수 있다. 피연산자는 음수나 0일 수 있지만, 나눗셈 카드의 피연산자는 0이 아니다.

한 판에서는 시작 정수 SS를 정하고 카드 CC장을 늘어놓는다. 참가자는 카드 순서를 마음대로 정할 수 있고, 각 카드를 정확히 한 번씩 쓴다. 정한 순서대로 SS에 연산을 차례로 적용하면 최종 결과가 나온다.

카드에 적힌 피연산자는 모두 정수지만, 연산은 유리수에서 이루어진다. 시작값이 5이고 카드가 + 1, - 2, * 3, / -2라고 하자. 적힌 순서 그대로 쓰면 결과는 (5+1−2)×3/(−2)=−6(5 + 1 - 2) \times 3 / (-2) = -6이다. 연산자 우선순위는 무시하고 카드 순서대로만 계산한다. 순서를 - 2, / -2, + 1, * 3으로 고르면 결과는 ((5−2)/(−2)+1)×3=−3/2((5 - 2) / (-2) + 1) \times 3 = -3/2이고, 이 카드 묶음으로 얻을 수 있는 최댓값이다.

시작값과 카드가 주어질 때 최종 결과의 최댓값을 구하라. 답은 분모가 양수인 기약분수로 나타낸다.

입력

첫째 줄에 테스트 케이스의 수 TT가 주어진다. 각 테스트 케이스의 첫째 줄에는 시작값 SS와 카드의 개수 CC가 주어진다. 이어서 CC개의 줄이 주어지고, 그중 i번째 줄에는 카드 한 장을 나타내는 연산 문자 OiO_i와 피연산자 정수 ViV_i가 주어진다. OiO_i는 +, -, *, / 중 하나다.

제한

  • 1≤T≤1001 \le T \le 100
  • −1000≤S≤1000-1000 \le S \le 1000
  • 모든 i에 대해 OiO_i는 +, -, *, / 중 하나다.
  • 모든 i에 대해 −1000≤Vi≤1000-1000 \le V_i \le 1000
  • 모든 i에 대해 OiO_i가 /이면 Vi≠0V_i \ne 0
  • 1≤C≤10001 \le C \le 1000

출력

각 테스트 케이스마다 Case #x: y z 형식으로 한 줄씩 출력한다. xx는 1부터 시작하는 테스트 케이스 번호이고, yy와 zz는 y/zy/z가 최종 결과의 최댓값이 되는 정수다. yy와 zz의 공약수는 1과 -1뿐이어야 하고, zz는 0보다 커야 한다.

참고

분자는 64비트 정수 범위를 훨씬 넘을 수 있으므로 임의 정밀도 연산이 필요하다.

값이 0일 때 올바른 표현은 0 1 하나뿐이다. 0 2는 약분되므로 틀리고, 0 -1은 분모가 음수이므로 틀린다.

예제3

  1. 예제 1

    입력
    5
    1 2
    - 3
    * 2
    5 4
    + 1
    - 2
    * 3
    / -2
    1000 7
    * -1000
    * -1000
    * 1000
    * 1000
    * 1000
    * 1000
    * 1000
    -1 3
    - -1
    * 0
    / -1
    0 1
    + 0
    
    예상 출력
    Case #1: -1 1
    Case #2: -3 2
    Case #3: 1000000000000000000000000 1
    Case #4: 1 1
    Case #5: 0 1
    
  2. 예제 2

    입력
    3
    -1000 3
    + 1000
    - -1000
    + 0
    1000 1
    / 3
    0 4
    * 4
    / 4
    + 1
    - 1
    
    예상 출력
    Case #1: 1000 1
    Case #2: 1000 3
    Case #3: 3 1
    
  3. 예제 3

    입력
    2
    5 3
    * 0
    + 3
    * 2
    0 3
    * 0
    - 5
    * -3
    
    예상 출력
    Case #1: 6 1
    Case #2: 15 1