만드는 중입니다

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

피보나치 접미사 배열

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

요약
피보나치 단어 fib_n의 접미사 배열을 구하고, 주어진 q개 위치의 값을 m으로 나눈 나머지로 출력합니다.
난이도

어려움10점 중 9점

유형
문자열, 재귀, 수학
정답자
아직 제출이 없습니다

문제

피보나치 단어는 다음과 같이 정의한다. fib_0=b,fib_1=a,fib_n=fib_n−1fib_n−2 for n≥2fib\_0=b, fib\_1=a, fib\_n=fib\_{n-1}fib\_{n-2} \text{ for } n \ge 2. fib_nfib\_n은 fib_n−1fib\_{n-1}과 fib_n−2fib\_{n-2}를 이어 붙인 문자열이다.

처음 몇 개의 피보나치 단어는 bb, aa, abab, abaaba, abaababaab, abaababaabaababa, abaababaabaababaababaabaab, …\dots이다.

길이가 nn인 문자열 ss의 접미사 배열은 1부터 nn까지의 정수를 원소로 하는 순열 sasa이며, s\[sa_1..n],s\[sa_2..n],…,s\[sa_n..n]s\[sa\_1.. n], s\[sa\_2..n], \dots, s\[sa\_n..n]이 ss의 비어 있지 않은 모든 접미사를 사전순으로 나열한 목록이 되도록 한다.

sasa를 fib_nfib\_n의 접미사 배열이라고 하자. (sa_p_1 mod m),(sa_p_2 mod m),…,(sa_p_q mod m)(sa\_{p\_1} \bmod m), (sa\_{p\_2} \bmod m), \dots, (sa\_{p\_q} \bmod m)의 값을 구하라.

입력

입력은 여러 테스트 케이스로 이루어지며, 파일의 끝(EOF)에서 끝난다. 각 테스트 케이스는 다음 형식이다.

첫 줄에 정수 nn, qq, mm이 주어진다.

둘째 줄에 qq개의 정수 p_1,p_2,…,p_qp\_1, p\_2, \dots, p\_q가 주어진다.

출력

각 테스트 케이스마다 (sa_p_1 mod m),(sa_p_2 mod m),…,(sa_p_q mod m)(sa\_{p\_1} \bmod m), (sa\_{p\_2} \bmod m), \dots, (sa\_{p\_q} \bmod m)의 qq개 값을 공백으로 구분하여 출력한다.

제한

  • 1≤n≤10181 \le n \le 10^{18}
  • 1≤q≤1051 \le q \le 10^5
  • 1≤m≤2×1091 \le m \le 2 \times 10^9
  • 1≤p_i≤min⁡(1018,∣fib_n∣)1 \le p\_i \le \min(10^{18}, |fib\_n|)
  • 모든 테스트 케이스의 qq 합은 10610^6을 넘지 않는다.

예제1

  1. 예제 1

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