아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

201 패턴을 피하는 상승 수열

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

요약
길이 n인 ascent sequence 가운데 패턴 201을 피하는 것의 개수를 소수 p로 나눈 나머지를 구한다. n은 최대 500이다.
난이도

어려움10점 중 9점

유형
동적 계획법, 조합론, 수학, 구현
정답자
아직 제출이 없습니다

문제

음이 아닌 정수로 이루어진 수열 ⟨a1,a2,…,an⟩\langle a_1, a_2, \ldots, a_n \rangle을 생각하자. 수열의 상승은 인접한 두 원소 중에서 인덱스가 큰 쪽의 값이 더 큰 쌍이다. 예를 들어 수열 ⟨0,2,3,1,0⟩\langle 0, 2, 3, 1, 0 \rangle에는 두 개의 상승이 있다. a1=0a_1 = 0에서 a2=2a_2 = 2로 가는 것과 a2=2a_2 = 2에서 a3=3a_3 = 3으로 가는 것이다. 수열의 처음 kk개 원소에 있는 상승의 개수를 AkA_k라고 쓰자. 위의 예에서 A1=0A_1 = 0, A2=1A_2 = 1, A3=2A_3 = 2, A4=2A_4 = 2, A5=2A_5 = 2이다.

수열 aa가 상승 수열이라는 것은 a1=0a_1 = 0이고, 모든 i≥2i \ge 2에 대해 부등식 ai≤Ai−1+1a_i \le A_{i-1} + 1이 성립한다는 뜻이다. 예를 들어 수열 ⟨0,2,3,1,0⟩\langle 0, 2, 3, 1, 0 \rangle은 a2=2a_2 = 2이고 A1=0A_1 = 0이므로 상승 수열이 아니다. 반면 수열 ⟨0,1,0,2,3⟩\langle 0, 1, 0, 2, 3 \rangle은 A1=0A_1 = 0, A2=1A_2 = 1, A3=1A_3 = 1, A4=2A_4 = 2이므로 상승 수열이다.

음이 아닌 정수로 이루어진 수열 ⟨a1,a2,…,an⟩\langle a_1, a_2, \ldots, a_n \rangle이 201 패턴을 피한다는 것은 i<j<ki < j < k이고 aj<ak<aia_j < a_k < a_i인 ii, jj, kk가 존재하지 않는다는 뜻이다. 예를 들어 수열 ⟨0,1,0,2,3⟩\langle 0, 1, 0, 2, 3 \rangle은 201 패턴을 피하지만, ⟨0,1,2,3,1,0,2⟩\langle 0, 1, 2, 3, 1, 0, 2 \rangle는 i=4i = 4, j=6j = 6, k=7k = 7에 대해 aj=0<ak=2<ai=3a_j = 0 < a_k = 2 < a_i = 3이므로 201 패턴을 피하지 않는다.

두 정수 nn과 pp가 주어진다. 201 패턴을 피하는 길이 nn의 상승 수열의 개수를 구하여 pp로 나눈 나머지를 출력하자.

입력

입력은 한 줄이며 두 정수 nn과 pp가 주어진다. (1≤n≤5001 \le n \le 500; 2≤p≤109+1232 \le p \le 10^9 + 123; pp는 소수)

출력

201 패턴을 피하는 길이 nn의 상승 수열의 개수를 pp로 나눈 나머지를 한 줄에 출력한다.

힌트

첫 번째 예제에서 201 패턴을 피하는 길이 3의 상승 수열은 다섯 개이다. ⟨0,0,0⟩\langle 0, 0, 0 \rangle, ⟨0,0,1⟩\langle 0, 0, 1 \rangle, ⟨0,1,0⟩\langle 0, 1, 0 \rangle, ⟨0,1,1⟩\langle 0, 1, 1 \rangle, ⟨0,1,2⟩\langle 0, 1, 2 \rangle.

두 번째 예제에서 길이 5의 상승 수열은 53개이며, ⟨0,1,2,0,1⟩\langle 0, 1, 2, 0, 1 \rangle을 제외한 나머지 모두가 201 패턴을 피한다.

예제2

  1. 예제 1

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

    입력
    5 239
    
    예상 출력
    52