트리 깊이

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

요약
순열의 각 구간에서 최솟값을 루트로 삼아 만든 이진 탐색 트리에서, 반전이 정확히 K개인 모든 순열에 대해 각 노드 i의 깊이 합을 구해 소수 M으로 나눈 나머지를 출력한다.
난이도

어려움10점 중 9점

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

문제

새해를 맞아 Farmer John은 소들에게 축제 분위기의 이진 탐색 트리(BST)를 선물하기로 했다!

BST를 만들기 위해 FJ는 먼저 정수 1…N1\ldots N의 순열 a={a1,a2,…,aN}a=\{a_1,a_2,\ldots,a_N\}에서 시작한다. 여기서 N≤300N\le 300이다. 그다음 인수 11과 NN으로 아래 의사코드를 실행한다.

generate(l,r):
  if l > r, return empty subtree;
  x = argmin_{l <= i <= r} a_i; // index of min a_i in {a_l,...,a_r}
  return a BST with x as the root, 
    generate(l,x-1) as the left subtree,
    generate(x+1,r) as the right subtree;

예를 들어 순열 {3,2,5,1,4}\{3,2,5,1,4\}는 다음과 같은 BST를 만든다.

    4
   / \
  2   5
 / \ 
1   3

di(a)d_i(a)는 aa에 대응하는 트리에서 노드 ii의 깊이, 즉 aia_i에서 루트까지 가는 경로 위의 노드 수를 뜻한다. 위 예에서 d4(a)=1,d2(a)=d5(a)=2d_4(a)=1, d_2(a)=d_5(a)=2이고 d1(a)=d3(a)=3d_1(a)=d_3(a)=3이다.

aa의 역전 수는 1≤i<j≤N1\le i<j\le N이고 ai>aja_i>a_j인 정수 쌍 (i,j)(i,j)의 개수와 같다. 소들은 FJ가 BST를 만들 때 사용할 aa의 역전 수가 정확히 KK라는 것을 알고 있다 (0≤K≤N(N−1)2)(0\le K\le \frac{N(N-1)}{2}). 이 조건을 만족하는 모든 aa에 대해, 각 1≤i≤N1\le i\le N마다 ∑adi(a)\sum_a d_i(a)를 MM으로 나눈 나머지를 구하시오.

입력

입력의 유일한 줄에는 공백으로 구분된 세 정수 N,K,MN, K, M이 주어지고 그다음에 줄 바꿈이 온다. MM은 [108,109+9][10^8,10^9+9] 범위의 소수이다.

출력

각 1≤i≤N1\le i\le N에 대해 ∑adi(a)(modM)\sum_a d_i(a)\pmod{M}을 나타내는 NN개의 정수를 공백으로 구분해 출력한다.

예제2

  1. 예제 1

    입력
    3 0 192603497
    
    예상 출력
    1 2 3
    
  2. 예제 2

    입력
    3 1 144408983
    
    예상 출력
    3 4 4