만드는 중입니다

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

피보나치 표현

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

요약
수열 a의 각 접두사에 대해 F_{a_i}의 합을 서로 다른 피보나치 수의 합으로 나타내는 방법의 수를 10^9+7로 나눈 나머지로 구합니다.
난이도

어려움10점 중 9점

유형
세그먼트 트리, 동적 계획법, 행렬
정답자
아직 제출이 없습니다

문제

피보나치 수열은 다음과 같이 정의한다.

  • F1=1F_1 = 1
  • F2=2F_2 = 2
  • n≥3n \ge 3일 때 Fn=Fn−1+Fn−2F_n = F_{n-1} + F_{n-2}

수열의 처음 몇 항은 1,2,3,5,8,13,21,…1, 2, 3, 5, 8, 13, 21, \ldots이다.

양의 정수 pp에 대해 X(p)X(p)는 pp를 서로 다른 피보나치 수의 합으로 나타내는 방법의 수이다. 어떤 피보나치 수가 두 방법 중 한쪽에만 포함되면 두 방법은 다른 것으로 본다.

양의 정수 nn개로 이루어진 수열 a1,a2,…,ana_1, a_2, \ldots, a_n이 주어진다. 비어 있지 않은 접두부 a1,a2,…,aka_1, a_2, \ldots, a_k마다 pk=Fa1+Fa2+⋯+Fakp_k = F_{a_1} + F_{a_2} + \cdots + F_{a_k}로 정의한다. k=1,…,nk = 1, \ldots, n 각각에 대해 X(pk)X(p_k)를 109+710^9 + 7로 나눈 나머지를 구하라.

입력

첫째 줄에 정수 nn이 주어진다 (1≤n≤100 0001 \le n \le 100\,000). 둘째 줄에는 공백으로 구분된 정수 a1,a2,…,ana_1, a_2, \ldots, a_n이 주어진다 (1≤ai≤1091 \le a_i \le 10^9).

출력

nn개의 줄을 출력한다. kk번째 줄에는 X(pk)X(p_k)를 109+710^9 + 7로 나눈 나머지를 출력한다.

예제1

  1. 예제 1

    입력
    4
    4 1 1 5
    
    예상 출력
    2
    2
    1
    2