수식 만들기

각 (x, y)에 대해 x, +, -, *, /만으로 y가 되는 후위 표기식을 문제가 정한 구성 방식대로 출력한다.

보통6동적 계획법구현완전 탐색아직 제출이 없습니다시간 제한4초메모리 제한512 MB

문제

퍼즐 하나를 보자. 흔히 쓰는 수학 기호와 숫자 44 네 개만으로 값이 113113인 수식을 쓸 수 있을까?

답 하나는 다음과 같다.

113=4+(4+4!)%4%113 = \frac{\sqrt{4} + (\sqrt{4} + 4!)\%}{\sqrt{4}\%}

여기서 !는 계승 기호이고 %는 백분율 기호다. 즉 11% = 0.11이다.

포 포스는 숫자 44 네 개와 흔히 쓰는 수학 기호만으로 주어진 수를 만드는 산술 퍼즐이다. 16=4+4+4+416 = 4 + 4 + 4 + 4처럼 쉬운 수도 있지만, 위의 113113처럼 그렇지 않은 수도 있다. 44 네 개로 20162016을 만들 수 있을까?

이 문제는 그 퍼즐의 변형이다. 두 정수 xxyy가 주어지면 다음 규칙을 지키면서 값이 yy인 수식을 써야 한다.

  • 수식에 쓸 수 있는 상수는 정수 xx 하나뿐이다.
  • 쓸 수 있는 연산은 덧셈, 뺄셈, 곱셈, 나눗셈뿐이다.
  • 수식의 연산 횟수는 2828번 이하다.
  • 중간 결과의 절댓값은 101810^{18}을 넘지 않는다.
  • 모든 나눗셈은 나누는 수가 0이 아니고 몫이 정수다.

규칙을 동시에 만족하는 수식은 여러 개다. 출력에서 그중 하나를 정하며, 그 수식을 출력한다.

입력

첫째 줄에 테스트 케이스의 개수 TT가 주어진다.

다음 TT개 줄에 각각 두 정수 xxyy가 공백을 사이에 두고 주어진다.

  • 1T2121211 \le T \le 212121
  • 0x,y<12120 \le x, y < 1212

출력

각 테스트 케이스마다 한 줄을 출력한다.

수식은 x, +, -, *, / 다섯 문자로 이루어진 문자열, 곧 후위 표기식으로 쓴다. 빈 스택에서 시작해 문자열을 왼쪽부터 읽으며 계산한다.

  • x는 수 xx를 스택에 넣는다.
  • +는 스택에서 두 수 bbaa를 이 순서로 꺼낸 다음 a+ba + b를 넣는다.
  • -bbaa를 꺼낸 다음 aba - b를 넣는다.
  • *bbaa를 꺼낸 다음 a×ba \times b를 넣는다.
  • /bbaa를 꺼낸 다음 a/ba / b를 넣는다.

마지막 문자까지 읽은 뒤 스택에 수가 정확히 하나 남아야 하고, 그 수가 수식의 값이다. 연산자를 읽을 때 스택에 수가 두 개보다 적거나 끝난 뒤 수가 정확히 하나가 아니면 계산은 실패한다.

다음 규칙이 정하는 수식을 출력한다.

  • x=0x = 0이고 y>0y > 0이면 IMPOSSIBLE을 출력한다.
  • y=0y = 0이면 xx-를 출력한다.
  • 그 밖에는 S(y)S(y) 뒤에 x/를 붙여 출력한다.

S(n)S(n)1n12111 \le n \le 1211에서 정의되며, 값이 n×xn \times x인 후위 표기식이다. S(n)S(n)에 들어 있는 문자 x의 개수를 c(n)c(n)이라 하자. n=1n = 1의 기본 문자열은 x이므로 c(1)=1c(1) = 1이다. 나머지 문자열은 다음 세 규칙으로 만든다.

  • 곱: n=a×bn = a \times b이고 2ab12112 \le a \le b \le 1211이면 S(a)S(a), S(b)S(b), *x/를 차례로 이어 붙인다. 문자 xc(a)+c(b)+1c(a) + c(b) + 1개다.
  • 합: n=a+bn = a + b이고 1ab12111 \le a \le b \le 1211이면 S(a)S(a), S(b)S(b), +를 차례로 이어 붙인다. 문자 xc(a)+c(b)c(a) + c(b)개다.
  • 차: n=abn = a - b이고 1b<a12111 \le b < a \le 1211이면 S(a)S(a), S(b)S(b), -를 차례로 이어 붙인다. 문자 xc(a)+c(b)c(a) + c(b)개다.

c(n)c(n)은 이 규칙으로 만들 수 있는 문자열의 문자 x 개수 중 가장 작은 값이고, S(n)S(n)은 그 최솟값에 도달하는 문자열이다. 도달하는 문자열이 여럿이면 곱, 합, 차 순으로 고르고, 같은 종류 안에서는 aa가 가장 작은 것을 고른다. 최솟값에 도달하는 문자열의 두 조각은 언제나 c(a)<c(n)c(a) < c(n)c(b)<c(n)c(b) < c(n)을 만족하므로 S(n)S(n)은 모든 nn에서 하나로 정해진다.

이렇게 출력한 수식의 연산 횟수는 2828번을 넘지 않는다.