아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

정수 분할

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

요약
k와 a가 주어질 때 k의 분할을 사전순으로 나열했을 때 a번째 분할을 출력하고, a가 전체 분할 수보다 크면 Too big을 출력한다.
난이도

어려움10점 중 8점

유형
동적 계획법, 조합론, 완전 탐색, 구현
정답자
아직 제출이 없습니다

문제

양의 정수 kk의 분할이란 kk를 양의 정수들의 합으로 나타내되, 그 정수들을 넓은 의미의 감소(비증가) 순서로 나열한 것이다. 분할은 a1≥a2≥⋯≥an≥1a_1 \ge a_2 \ge \dots \ge a_n \ge 1이고 a1+a2+⋯+an=ka_1 + a_2 + \dots + a_n = k인 수열 (a1,a2,…,an)(a_1, a_2, \dots, a_n)으로 표현한다. 예를 들어 (12)(12), (2,2,2,2,2,2)(2,2,2,2,2,2), (5,3,2,1,1)(5,3,2,1,1)은 모두 1212의 분할이다.

서로 다른 두 분할 A=(a1,a2,…,an)A = (a_1, a_2, \dots, a_n)과 B=(b1,b2,…,bm)B = (b_1, b_2, \dots, b_m)에 대해, 두 수열이 처음으로 달라지는 위치를 tt라 하자(즉 i<ti < t인 모든 ii에서 ai=bia_i = b_i이고 at≠bta_t \ne b_t). 이때 at>bta_t > b_t이면 A>BA > B로 정의한다. AA와 BB가 같은 정수의 분할이므로 이러한 위치 tt는 항상 존재한다.

이 규칙에 따라 kk의 모든 분할을 사전식으로 작은 것부터 큰 것까지 정렬할 수 있다. 예를 들어 55의 분할을 순서대로 나열하면 다음과 같다.

(1,1,1,1,1)
(2,1,1,1)
(2,2,1)
(3,1,1)
(3,2)
(4,1)
(5)

kk와 양의 정수 aa가 주어질 때, 이렇게 정렬한 kk의 분할 목록에서 (11부터 세어) aa번째 분할을 구하여라.

입력

첫째 줄에 테스트 케이스의 수 NN이 주어진다. 이어지는 NN개의 줄에는 각각 두 양의 정수 kk와 aa가 주어진다.

출력

각 테스트 케이스마다 kk의 분할을 사전식 순서로 나열했을 때 aa번째 분할을 출력한다. 각 부분을 쉼표로 구분하고 전체를 괄호로 감싸서, 예를 들어 (5,3,2,1,1)과 같은 형식으로 출력한다. 만약 aa가 kk의 분할의 총 개수보다 크면 대신 Too big을 출력한다.

예제2

  1. 예제 1

    입력
    3
    1 1
    5 4
    5 8
    
    예상 출력
    (1)
    (3,1,1)
    Too big
    
  2. 예제 2

    입력
    7
    5 1
    5 2
    5 3
    5 4
    5 5
    5 6
    5 7
    
    예상 출력
    (1,1,1,1,1)
    (2,1,1,1)
    (2,2,1)
    (3,1,1)
    (3,2)
    (4,1)
    (5)