만드는 중입니다

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

해적 코드

시간 제한2초메모리 제한1024 MB

요약
길이가 k인 모든 이진 코드를 피보나치 기반으로 해독한 값의 합을 k=1부터 n까지 10^9+7로 나눈 나머지로 구합니다.
난이도

어려움10점 중 8점

유형
동적 계획법, 조합론, 문자열
정답자
아직 제출이 없습니다

문제

선장 마르트리나와 해적 선원들은 이탈리아에서 가장 유명한 해적이 남긴 오래된 보물을 3개월 동안 찾아다닌 끝에, 금화가 가득 든 상자를 마침내 파냈다. 상자를 열려면 비밀 조합이 필요하다. 그 조합은 상자 옆에 있던 병 속 편지에 적혀 있다.

편지에는 다음과 같이 적혀 있다:

가장 가치 있는 해적만 상자를 열 수 있도록, 조합은 다음 문제의 답이다. 길이가 aa인 이진 수열 ss에서 연속한 1의 쌍이 수열의 끝에만 있을 때, 이 수열을 수 xx의 해적 표현이라 한다. 그 조건은 다음과 같다.

∑i=0a−2s[i]⋅Fib[2+i]=x\sum_{i=0}^{a-2} s[i] \cdot Fib[2+i] = x

여기서 Fib[x]Fib[x]는 xx번째 피보나치 수이다. 피보나치 수는 Fib[1]=1Fib[1] = 1, Fib[2]=1Fib[2] = 1이고, y>2y > 2인 모든 yy에 대해 Fib[y]=Fib[y−1]+Fib[y−2]Fib[y] = Fib[y-1] + Fib[y-2]로 정의된다.

예를 들어 11p=111_p = 1, 011p=2011_p = 2, 1010011p=171010011_p = 17이다. 여기서 pp는 수의 해적 표현을 나타낸다.

해적 코드는 연속한 1에 대한 제약이 없는 이진 수열이며, 양의 정수들의 수열을 나타낸다. 이를 읽으려면 각 부분이 어떤 수의 해적 표현이 되도록, 가능한 한 많은 부분으로 나눈다. 어떤 수의 해적 표현도 아닌 접미사가 남을 수 있으며, 이때 그 접미사는 버린다. 이후 각 부분의 정수를 순서대로 적는다. 예를 들어 0111101011010101111010110101은 011|11|01011|0101로 나뉜다. 마지막 부분은 해적 표현이 아니므로 버려져 011|11|01011이 남고, 이는 수열 22, 11, 77로 읽힌다.

해적 코드의 값은 해독된 양의 정수 수열의 값의 합이다. 앞의 코드의 값은 1010이다.

내가 좋아하는 수 PP는 길이가 kk인 모든 해적 코드 값의 합이다. 이 수는 클 수 있으므로, 상자의 비밀 조합은 PP를 109+710^9 + 7로 나눈 나머지이다.

마르트리나가 상자를 열지 못하면 선원들은 그녀를 가치 없다고 여겨 널빤지 위를 걷게 만들 것이다.

  • Leonarrrdo da Pisa

입력

첫 번째이자 유일한 줄에 양의 정수 nn이 주어진다. (n≤5000n \le 5000)

출력

한 줄에 nn개의 수를 출력한다. kk번째 수는 길이가 kk인 코드 문제의 답이다.

설명

길이가 11인 코드는 00과 11이며, 둘 다 값이 00이다.

코드 1111의 값은 11이고, 길이가 11인 나머지 코드의 값은 모두 00이다.

코드 11111111의 값은 22이고, 코드 00110011의 값은 33이다.

예제1

  1. 예제 1

    입력
    4
    
    예상 출력
    0 1 4 16