만드는 중입니다

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

조금 똑똑한 뢰벗과 조금 잘생긴 사냐

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

요약
F(1)=1, F(2)=2인 피보나치 수열에서 이웃하지 않는 항들의 합으로 N을 나타내되 항의 개수가 최대가 되도록 하고, 불가능하면 -1을 출력한다.
난이도

보통10점 중 7점

유형
그리디, 수학, 정수론, 구현
정답자
아직 제출이 없습니다

문제

*이 문제는 실제 인물과 관련이 없습니다.*

먼 옛날에 사냐라는 사람이 살았다. 사냐에게는 뢰벗이라는 친구가 있었는데, 둘은 무척 닮았지만 뢰벗이 조금 더 똑똑하고 사냐가 조금 더 잘생겼다고 한다. 뢰벗은 오보워치(Ovorwatch)라는 게임에서 500점에 머물러 상위 100.00%였다. 사냐는 그런 뢰벗을 놀리기 좋아했다. 열을 받은 뢰벗은 자신이 오보워치 500점을 탈출하면 사냐가 자신이 내는 문제를 평생 풀도록 하겠다는 내기를 걸었고, 사냐는 설마 탈출하겠냐는 생각으로 받아들였다.

그런데 그 일이 벌어졌습니다.

뢰벗은 점수를 무려 600점대까지 올렸고, 사냐는 내기 때문에 뢰벗이 내는 문제를 평생 풀어야 하게 되었다. 뢰벗이 낸 문제는 이렇다. 자신이 주는 자연수를 연속하지 않은 피보나치 수의 합으로 나타내라. 여기서 피보나치 수열은 F(1)=1F(1) = 1, F(2)=2F(2) = 2, F(n+2)=F(n+1)+F(n)F(n+2) = F(n+1) + F(n)으로 정의한다. 연속하지 않는다는 말은 고른 항의 번호가 이웃하지 않는다는 뜻이다. 멍청한 사냐는 피보나치 수열을 손으로 계산하느라 시간이 너무 오래 걸려 미칠 것만 같아졌다. 똑똑한 뢰벗은 그것도 계산 못 하냐며 놀렸고, 사냐는 시무룩해졌다. 시무룩해진 사냐의 노동을 덜어 줄 프로그램을 짜 보자.

입력

첫째 줄에 자연수 NN이 주어진다. (1≤N<10181 \le N < 10^{18})

출력

NN을 i1<i2<⋯<iki_1 < i_2 < \dots < i_k이고 이웃한 두 번호가 연속하지 않는, 즉 모든 jj에 대해 ij+1−ij≥2i_{j+1} - i_j \ge 2인 F(i1)+F(i2)+⋯+F(ik)F(i_1) + F(i_2) + \dots + F(i_k)로 나타낼 수 있다면, 첫째 줄에 kk를 출력하고 둘째 줄에 F(i1),F(i2),…,F(ik)F(i_1), F(i_2), \dots, F(i_k)를 공백으로 구분해 출력한다. 나타낼 수 없다면 첫째 줄에 −1-1을 출력한다. 여러 가지 방법으로 나타낼 수 있다면 그 가운데 항의 수가 가장 많은 것을 출력한다.

예제5

  1. 예제 1

    입력
    10
    
    예상 출력
    2
    2 8
    
  2. 예제 2

    입력
    1
    
    예상 출력
    1
    1
    
  3. 예제 3

    입력
    2
    
    예상 출력
    1
    2
    
  4. 예제 4

    입력
    3
    
    예상 출력
    1
    3
    
  5. 예제 5

    입력
    4
    
    예상 출력
    2
    1 3