한별이는 문자 P와 @만을 사용하는 프로그래밍 언어를 만들었다.
한별이의 언어에서 올바른 프로그램을 이루는 문자열의 규칙은 다음과 같다.
P와 @ 중 하나여야 하며, 같은 문자가 4번 이상 연속해서 등장하면 안 된다.PPP를 (로 바꾸고, @@@을 )로 바꾼 다음, 남아있는 P와 @을 지우면 올바른 괄호열이 되어야 한다.이때 올바른 괄호열이란 다음과 같이 정의된다.
(X)도 올바른 괄호열이다.한별이의 언어는 프로그램을 실행하기 전에, 카운터 변수 C의 값을 0으로 초기화하고, 프로그램에 대해 전처리로 다음과 같은 과정을 순서대로 거친다.
PPP를 (로 바꾼다.@@@을 )로 바꾼다.P를 +로 바꾼다.@을 -로 바꾼다.예를 들어, 프로그램이 PPP@PP@PP@@@라고 하면, 전처리를 거친 후에는 (-++-++)이 된다.
전처리한 프로그램을 실행할 때, +는 C를 1 증가시키고, -는 1 감소시킨다. 한편, (와 )는 반복문으로, (와 ) 사이의 코드를 3 번 반복해서 실행한다.
이를 의사코드로 표현하면 다음과 같다. 이때 문자열 S에 대해 S\[i] 는 i 번째 문자를, S\[i..j]는 문자열 S에서 i 번째 문자부터 j 번째 문자까지(경계 포함)의 부분 문자열을 의미한다.
Algorithm run(전처리한 프로그램 S)
i를 1로 설정한다.
while i ≤ S의 길이
if S\[i]가 +면
else if S\[i]가 -면
else if S\[i]가 (면
)의 인덱스로 설정한다.run(A\[i+1..j−1])을 3 회 실행한다.정수 N이 주어졌을 때, 프로그램 실행 후 C의 값이 N인 길이가 가장 짧은 올바른 프로그램 중에서, 사전 순으로 가장 빠른 프로그램을 출력하라. (@이 P보다 사전 순으로 앞선다.)
첫째 줄에 테스트케이스의 개수 T가 주어진다. (1≤T≤10,000)
각 테스트케이스마다 한 줄에 정수 N이 주어진다. (1≤∣N∣≤1018)
각 줄마다 각 테스트케이스에 대해 프로그램 실행 후 C의 값이 N인 길이가 가장 짧은 올바른 프로그램 중 사전 순으로 가장 빠른 프로그램을 출력하라.