배낭 문제 준비하기

t가 주어지면 k=300과 1 육십 개에 이항계수 탐욕 분해로 고른 원소를 더해 합이 300인 부분집합이 정확히 t개가 되도록 출력합니다.

쉬움3조합론구현아직 제출이 없습니다시간 제한1초메모리 제한32 MB

문제

문제를 출제할 때 큰 비중을 차지하는 일이 데이터 만들기다. 데이터를 만드는 정해진 방법은 없고, 문제마다 나올 만한 오답을 최대한 떠올린 다음 그 오답을 걸러내는 데이터를 준비해야 한다.

다음 문제를 생각해 보자.

중복이 허용되는 집합 S={a1,a2,,an}S = \{a_1, a_2, \dots, a_n\}이 주어진다. SS의 부분집합 가운데 모든 원소의 합이 kk인 것은 몇 개인가? 값이 같은 원소라도 위치가 다르면 서로 다르다고 센다.

제약 조건은 1n3001 \le n \le 300, 1k3001 \le k \le 300이고, SS의 원소는 모두 kk 이하의 자연수다.

이 문제에서 나올 만한 오답을 떠올리다 보니, 답이 정확히 tt인 데이터에서 t1t - 1을 출력하는 답안이 있었다. 그런 답안을 걸러내려면 자연수 tt가 주어졌을 때 위 문제의 답이 tt가 되는 집합 SS와 자연수 kk를 구하는 프로그램이 필요하다. 그 프로그램을 대신 작성해라.

조건을 만족하는 데이터는 여러 가지이므로, 출력에 적어 둔 방법으로 만든 데이터 하나만 정답으로 인정한다.

입력

첫째 줄에 자연수 tt가 주어진다. (1t10181 \le t \le 10^{18})

출력

첫째 줄에 nnkk를 공백으로 구분해 출력한다. 둘째 줄에 a1,a2,,ana_1, a_2, \dots, a_n을 비내림차순으로, 공백으로 구분해 출력한다. nn, kk, SS는 위 제약 조건을 반드시 만족해야 한다.

데이터는 다음 방법으로만 만든다.

  1. k=300k = 300으로 둔다.
  2. 값이 1인 원소를 60개 넣는다.
  3. r=tr = t로 두고, r>0r > 0인 동안 다음을 반복한다. 0d300 \le d \le 30 범위에서 (60d)r\binom{60}{d} \le r을 만족하는 가장 큰 정수 dd를 고르고, 값이 300d300 - d인 원소를 하나 넣은 뒤 rr에서 (60d)\binom{60}{d}를 뺀다.
  4. nn은 넣은 원소의 총 개수다.

3단계에서 넣은 원소는 각각 합이 300인 부분집합을 (60d)\binom{60}{d}개 만들고, 합이 300인 부분집합은 3단계에서 넣은 원소를 정확히 하나 포함한다. 그래서 이 데이터의 답은 정확히 tt가 된다. t1018t \le 10^{18}이면 nn은 242를 넘지 않는다.