피보나치 진법

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

요약
1,2,3,...을 피보나치 진법으로 표현한 문자열들을 이어붙였을 때, 앞에서부터 N개의 문자(N은 최대 10^15) 중에 1이 몇 개 나오는지 구하는 문제입니다.
난이도

어려움10점 중 9점

유형
수학, 정수론, 이분 탐색, 조합론
정답자
아직 제출이 없습니다

문제

피보나치 진법은 0과 1만으로 모든 자연수를 유일하게 나타내는 방법이다.

자연수 NN을 피보나치 진법으로 N=anan−1⋯a1‾FN = \overline{a_n a_{n-1} \cdots a_1}_F 와 같이 나타내면, 그 값은 N=anFn+an−1Fn−1+⋯+a1F1N = a_n F_n + a_{n-1} F_{n-1} + \cdots + a_1 F_1 이다. 여기서 FkF_k는 피보나치 수열로 F0=F1=1F_0 = F_1 = 1, Fi=Fi−1+Fi−2F_i = F_{i-1} + F_{i-2} 로 정의된다. 각 자연수를 유일하게 나타내기 위해, 피보나치 진법에서는 두 개의 1이 서로 인접할 수 없다.

다음은 몇몇 자연수를 피보나치 진법으로 나타낸 것이다.

1=1F,2=10F,3=100F,4=101F,5=1000F,6=1001F,7=1010F1 = 1_F, \quad 2 = 10_F, \quad 3 = 100_F, \quad 4 = 101_F, \quad 5 = 1000_F, \quad 6 = 1001_F, \quad 7 = 1010_F

이제 자연수 1,2,3,⋯1, 2, 3, \cdots 를 차례대로 피보나치 진법으로 나타낸 뒤, 그 결과 문자열을 모두 이어 붙이자. 그러면 만들어지는 문자열의 앞부분은 110100101100010011010⋯\cdots 이 된다.

이 문자열의 처음 NN글자 중에 1이 몇 개 있는지 구하여라.

입력

첫째 줄에 정수 NN이 주어진다. (0≤N≤10150 \le N \le 10^{15})

출력

이어 붙인 문자열의 처음 NN글자에 들어 있는 1의 개수를 출력한다.

예제5

  1. 예제 1

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

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

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

    입력
    2
    
    예상 출력
    2
    
  5. 예제 5

    입력
    3
    
    예상 출력
    2