만드는 중입니다

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

괄호 문자열 사전순 (작은 입력)

면접 대비

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

요약
n쌍의 올바른 괄호 문자열을 사전 순으로 세어 각 테스트 케이스의 k번째 문자열을 출력합니다.
난이도

보통10점 중 5점

유형
동적 계획법, 조합론
정답자
아직 제출이 없습니다

문제

길이가 2n2n인 괄호 문자열은 여는 괄호 ( nn개와 닫는 괄호 ) nn개로 이루어진다.

올바른 괄호 문자열은 다음과 같이 정의한다.

서로 붙어 있는 () 쌍을 지우는 과정을 반복해서 빈 문자열로 만들 수 있는 문자열.

예를 들어 (())는 올바른 괄호 문자열이다. 2번째와 3번째 위치의 쌍을 지우면 ()가 되고, 이것을 다시 지우면 빈 문자열이 된다. )()(는 올바르지 않다. 2번째와 3번째 위치의 쌍을 지우면 )(가 남고 더는 지울 수 없다.

여는 괄호와 닫는 괄호가 각각 nn개인 올바른 괄호 문자열을 모두 모아 사전순으로 정렬했을 때, kk번째 문자열을 구하라. 사전순 비교에서 (가 )보다 앞선다.

예를 들어 n=3n = 3인 올바른 괄호 문자열을 사전순으로 나열하면 다음과 같다.

((()))
(()())
(())()
()(())
()()()

입력

첫째 줄에 테스트 케이스의 개수 TT가 주어진다. 이어지는 TT개의 줄에 각각 정수 nn과 kk가 공백으로 구분되어 주어진다.

출력

각 테스트 케이스마다 Case #x: y 형식으로 한 줄씩 출력한다. xx는 1부터 시작하는 테스트 케이스 번호이고, yy는 여는 괄호와 닫는 괄호가 각각 nn개인 올바른 괄호 문자열 중 사전순으로 kk번째인 문자열이다. 그런 문자열이 kk개보다 적으면 yy 자리에 Doesn't Exist!를 출력한다.

제한

  • 1≤T≤1001 \le T \le 100
  • 1≤n≤101 \le n \le 10
  • 1≤k≤1000001 \le k \le 100000

예제2

  1. 예제 1

    입력
    3
    2 2
    3 4
    3 6
    
    예상 출력
    Case #1: ()()
    Case #2: ()(())
    Case #3: Doesn't Exist!
    
  2. 예제 2

    입력
    1
    1 1
    
    예상 출력
    Case #1: ()