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

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

덧셈 체인

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

요약
100 이하의 각 n에 대해 n으로 끝나는 최단 덧셈 사슬을 구하고, 그중 사전순으로 가장 작은 것을 출력한다.
난이도

어려움10점 중 8점

유형
DFS, 백트래킹, 완전 탐색, 그리디
정답자
아직 제출이 없습니다

문제

어떤 자연수 nn에 대하여, 다음 네 조건을 모두 만족하는 자연수 수열 ⟨a0,a1,…,am⟩\langle a_0, a_1, \ldots, a_m \rangle을 nn의 덧셈 체인이라고 한다.

  1. a0=1a_0 = 1
  2. am=na_m = n
  3. a0<a1<a2<⋯<am−1<ama_0 < a_1 < a_2 < \cdots < a_{m-1} < a_m
  4. 모든 k (1≤k≤m)k\ (1 \le k \le m)에 대하여 ak=ai+aja_k = a_i + a_j를 만족하는 두 첨자 i,ji, j (0≤i,j≤k−10 \le i, j \le k-1, i=ji = j 허용)가 존재한다.

즉, 첫 항은 11이고 마지막 항은 nn이며, 수열은 순증가하고, 각 항은 앞선 두 항(같은 항을 두 번 사용해도 된다)의 합으로 만들어진다. 항의 개수가 가장 적은(즉 mm이 최소인) 덧셈 체인을 가장 짧은 덧셈 체인이라고 한다.

가장 짧은 덧셈 체인은 여러 개일 수 있다. 그러한 체인들 중에서 사전순으로 가장 앞서는 것을 출력하라. 두 수열의 사전순 비교는 앞에서부터 항을 하나씩 비교하여, 처음으로 값이 달라지는 위치에서 더 작은 값을 가지는 수열이 앞선다고 정한다.

자연수 nn이 여러 개 주어질 때, 각각에 대하여 가장 짧은 덧셈 체인 중 사전순으로 가장 앞서는 것을 구하는 프로그램을 작성하시오.

입력

입력은 하나 이상의 테스트 케이스로 이루어진다. 각 테스트 케이스는 한 줄에 자연수 nn (1≤n≤1001 \le n \le 100)이 주어진다. 입력의 마지막 줄에는 00이 하나 주어지며, 이 줄은 처리하지 않는다.

출력

각 테스트 케이스마다 한 줄에, 가장 짧은 덧셈 체인 중 사전순으로 가장 앞서는 것을 공백으로 구분하여 출력한다.

예제2

  1. 예제 1

    입력
    5
    7
    12
    15
    77
    0
    
    예상 출력
    1 2 3 5
    1 2 3 4 7
    1 2 3 6 12
    1 2 3 5 10 15
    1 2 4 5 9 18 36 41 77
    
  2. 예제 2

    입력
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    0
    
    예상 출력
    1
    1 2
    1 2 3
    1 2 4
    1 2 3 5
    1 2 3 6
    1 2 3 4 7
    1 2 4 8
    1 2 3 6 9
    1 2 3 5 10