괄호 문자열 나열

N과 M이 주어질 때, '('가 ')'보다 작다는 사전순으로 길이 N인 올바른 괄호 문자열 중 M번째를 출력한다.

보통6조합론동적 계획법그리디구현면접 대비아직 제출이 없습니다시간 제한2초메모리 제한512 MB

문제

올바른 괄호 문자열은 문자 ()로만 이루어진 문자열 중에서, 여는 괄호마다 짝이 되는 닫는 괄호가 있고 닫는 괄호마다 짝이 되는 여는 괄호가 있는 문자열이다. 예를 들어 (())()는 올바른 괄호 문자열이지만, (())(()())(()는 아니다.

길이가 같은 두 괄호 문자열 AABB가 다음 두 조건을 모두 만족하면 AABB보다 사전순으로 작다고 하고 A<BA < B로 쓴다.

  1. AABB가 적어도 한 자리에서 다르다.
  2. AABB가 처음으로 달라지는 가장 왼쪽 자리에서 AA(이고 BB)이다.

예를 들어 (())()<()()()(())() < ()()()이다. 두 문자열은 왼쪽에서 두 번째 자리에서 처음 달라지는데, 앞 문자열은 그 자리가 (이고 뒤 문자열은 )이기 때문이다.

길이 NN을 고정하면 << 관계가 길이 NN인 올바른 괄호 문자열 전체의 순서를 정한다. N=6N = 6일 때 순서는 다음과 같다.

  1. ((()))
  2. (()())
  3. (())()
  4. ()(())
  5. ()()()

NN과 양의 정수 MM이 주어질 때, 이 순서에서 MM번째 올바른 괄호 문자열을 구하라.

입력

첫째 줄에 짝수 NN (2N20002 \le N \le 2000)과 양의 정수 MM이 공백을 사이에 두고 주어진다. MM101810^{18} 이하이고, 길이 NN인 올바른 괄호 문자열의 개수 이하이다.

출력

위에서 정의한 순서로 MM번째인 길이 NN의 올바른 괄호 문자열을 출력한다.