연산 게임 (Small)

시작값 S와 최대 15장의 연산 카드가 주어질 때, 모든 카드를 한 번씩 원하는 순서로 적용해 얻을 수 있는 최대 유리수 결과를 기약분수로 출력한다.

어려움8완전 탐색백트래킹수학구현아직 제출이 없습니다시간 제한5초메모리 제한512 MB

문제

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

한 라운드에서는 시작 정수 SS와 카드 CC장을 받는다. 카드의 순서를 정하고 각 카드를 정확히 한 번씩 쓴다. 정한 순서대로 SS에 연산을 적용해서 마지막 값을 얻는다.

카드에 적힌 피연산자는 모두 정수지만 연산은 유리수 위에서 이루어진다. 시작 값이 5이고 카드가 + 1, - 2, * 3, / -2라고 하자. 적힌 순서대로 쓰면 결과는 (5+12)×3/(2)=6(5 + 1 - 2) \times 3 / (-2) = -6이다. 연산자 우선순위는 따지지 않고 카드 순서대로만 적용한다. - 2, / -2, + 1, * 3 순서로 쓰면 결과는 ((52)/(2)+1)×3=3/2((5 - 2) / (-2) + 1) \times 3 = -3/2이고, 이 카드 집합으로 만들 수 있는 최댓값이다.

카드 집합이 주어질 때 만들 수 있는 최종 값의 최댓값을 구한다. 답은 분모가 양수인 기약분수로 나타낸다.

입력

첫째 줄에 테스트 케이스의 수 TT가 주어진다. 각 테스트 케이스의 첫 줄에는 시작 값 SS와 카드의 수 CC가 공백으로 구분되어 주어진다. 이어지는 CC개의 줄에 카드가 한 장씩 주어진다. ii번째 줄에는 연산을 나타내는 문자 OiO_i와 피연산자인 정수 ViV_i가 주어진다.

제한

  • 1T1001 \le T \le 100
  • 1000S1000-1000 \le S \le 1000
  • 모든 ii에 대해 OiO_i+, -, *, / 중 하나다.
  • 모든 ii에 대해 1000Vi1000-1000 \le V_i \le 1000
  • OiO_i/이면 Vi0V_i \ne 0
  • 1C151 \le C \le 15

출력

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

힌트

예제의 첫 번째 케이스에서는 * 2- 3보다 먼저 쓰면 -1이 되고, 조건에 맞게 나타내면 -1 1이다.

두 번째 케이스는 문제에서 설명한 예와 같다.

세 번째 케이스는 카드를 어떤 순서로 써도 결과가 같다. 답의 분자는 64비트 정수에 들어가지 않는다.

네 번째 케이스에서 얻을 수 있는 최댓값은 1이다. / -1, * 0, - -1 순서로 쓰면 된다.

다섯 번째 케이스의 답은 0 1뿐이다. 0 2는 약분이 되고, 0 -1은 분모가 양수가 아니다.