트리 깊이
시간 제한2초메모리 제한512 MB
순열의 각 구간에서 최솟값을 루트로 삼아 만든 이진 탐색 트리에서, 반전이 정확히 K개인 모든 순열에 대해 각 노드 i의 깊이 합을 구해 소수 M으로 나눈 나머지를 출력한다.
문제
새해를 맞아 Farmer John은 소들에게 축제 분위기의 이진 탐색 트리(BST)를 선물하기로 했다!
BST를 만들기 위해 FJ는 먼저 정수 의 순열 에서 시작한다. 여기서 이다. 그다음 인수 과 으로 아래 의사코드를 실행한다.
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;
예를 들어 순열 는 다음과 같은 BST를 만든다.
4
/ \
2 5
/ \
1 3
는 에 대응하는 트리에서 노드 의 깊이, 즉 에서 루트까지 가는 경로 위의 노드 수를 뜻한다. 위 예에서 이고 이다.
의 역전 수는 이고 인 정수 쌍 의 개수와 같다. 소들은 FJ가 BST를 만들 때 사용할 의 역전 수가 정확히 라는 것을 알고 있다 . 이 조건을 만족하는 모든 에 대해, 각 마다 를 으로 나눈 나머지를 구하시오.
입력
입력의 유일한 줄에는 공백으로 구분된 세 정수 이 주어지고 그다음에 줄 바꿈이 온다. 은 범위의 소수이다.
출력
각 에 대해 을 나타내는 개의 정수를 공백으로 구분해 출력한다.