군꺾문자열

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

요약
기약분수 a/b가 주어질 때, +1과 2로 나누기 연산을 순서대로 적용해 정확히 a/b를 만드는 가장 짧은 문자열을 구하고, 길이가 같으면 사전순으로 가장 빠른 것을 찾는다.
난이도

어려움10점 중 8점

유형
수학, 정수론, 그리디, 백트래킹
정답자
아직 제출이 없습니다

문제

군꺾문자열은 군과 꺾으로 이루어진 문자열로, 복무율을 표현하는 방법 중 하나이다. 군꺾문자열 SS가 표현하는 복무율의 값은 다음과 같이 계산한다.

  • 초기 상태에서 x=0x = 0이다.
  • SS를 차례대로 읽으면서 군이면 xx에 11을 더하고, 꺾이면 xx를 22로 나눈다.
  • 모든 글자를 읽은 후 xx의 값이 SS가 표현하는 복무율이다.

예를 들어, 군꺾문자열 군꺾군군꺾꺾꺾이 표현하는 복무율 xx를 계산하는 과정은 다음과 같다.

  1. 군 → x=1x = 1
  2. 꺾 → x=12x = \frac{1}{2}
  3. 군 → x=32x = \frac{3}{2}
  4. 군 → x=52x = \frac{5}{2}
  5. 꺾 → x=54x = \frac{5}{4}
  6. 꺾 → x=58x = \frac{5}{8}
  7. 꺾 → x=516x = \frac{5}{16}

따라서 군꺾군군꺾꺾꺾은 516\frac{5}{16}의 복무율을 표현한다.

하늘이의 현재 복무율을 뜻하는 기약분수 ab\frac{a}{b}가 주어진다. 이를 정확히 표현하는 가장 짧은 군꺾문자열을 구하여라. 만약 ab\frac{a}{b}를 표현하는 가장 짧은 군꺾문자열이 여러 개라면 그 중 사전순으로 가장 빠른 것을 구하여라.

만약 하늘이의 복무율 ab\frac{a}{b}를 어떤 군꺾문자열로도 표현할 수 없다면 −1-1을 출력한다.

입력

첫째 줄에 정수 a,ba, b가 공백을 사이에 두고 주어진다. (1≤a<b≤1091 \leq a < b \leq 10^9, aa와 bb는 서로소)

출력

첫째 줄에 ab\frac{a}{b}를 표현하는 가장 짧은 군꺾문자열을 출력한다. 만약 ab\frac{a}{b}를 표현하는 가장 짧은 군꺾문자열이 여러 개라면 그 중 사전순으로 가장 빠른 것을 출력한다. 이때 군은 G, 꺾은 K로 출력한다.

만약 하늘이의 복무율 ab\frac{a}{b}를 군꺾문자열로 표현할 수 없다면 첫째 줄에 −1-1을 출력한다.

예제2

  1. 예제 1

    입력
    1 4
    
    예상 출력
    GKK
    
  2. 예제 2

    입력
    5 7
    
    예상 출력
    -1