이진 탐색 트리 개수 세기
시간 제한1초메모리 제한128 MB
주어진 삽입 순서가 만든 이진 탐색 트리와 같은 모양을 만드는, 1부터 M까지의 서로 다른 값으로 이루어진 삽입 순서의 개수를 1000003으로 나눈 나머지를 구한다.
문제
이진 탐색 트리(BST) 는 다음 성질을 만족하는 루트 있는 이진 트리이다.
- 한 노드의 왼쪽 서브트리에는 그 노드보다 작은 값만 들어 있다.
- 한 노드의 오른쪽 서브트리에는 그 노드보다 큰 값만 들어 있다.
- 트리에 있는 모든 값은 서로 다르다.
- 두 서브트리 또한 각각 이진 탐색 트리이다.
BST는 값을 하나씩 삽입하여 만든다. 새 값을 삽입하는 방법은 다음과 같다.
- 트리가 비어 있으면 새 값이 루트가 된다.
- 그렇지 않으면 루트를 현재 노드로 삼는다.
- 새 값이 현재 노드의 값보다 작으면 왼쪽 자식으로 내려간다. 그 자식이 비어 있으면 그 자리에 새 값을 놓는다.
- 새 값이 현재 노드의 값보다 크면 오른쪽 자식으로 내려간다. 그 자식이 비어 있으면 그 자리에 새 값을 놓는다.
- 새 값이 놓일 때까지 이 과정을 반복한다.
만들어지는 트리의 모양 은 값을 삽입하는 순서에 따라 달라진다. 같은 값들의 집합이라도 삽입 순서가 다르면 다른 모양이 될 수 있고, 서로 다른 값들의 집합이 같은 모양을 만들 수도 있다. 예를 들어 순서로 삽입하면 오른쪽으로 치우친 사슬 모양이 되고, 순서로 삽입하면 균형 잡힌 트리가 된다. 또한 과 는 같은 모양을 만든다.
개의 값으로 이루어진 하나의 삽입 순서로 정의된 BST가 주어진다. 범위에서 고른 서로 다른 개의 값으로 이루어진 삽입 순서 중에서, 이와 정확히 같은 모양의 트리를 만드는 것이 몇 가지인지 세어라. 이 개수는 매우 클 수 있으므로 으로 나눈 나머지를 출력한다.
입력
첫째 줄에 테스트 케이스의 수 () 가 주어진다.
각 테스트 케이스는 두 줄로 이루어진다. 첫째 줄에는 두 정수 과 () 이 주어지며, 각각 트리의 노드 수와 값의 범위 크기를 뜻한다. 둘째 줄에는 트리의 모양을 정의하는 삽입 순서인 서로 다른 개의 정수 () 이 주어진다.
출력
각 테스트 케이스마다, 범위의 값을 사용하여 같은 모양의 트리를 만드는 서로 다른 삽입 순서의 개수를 으로 나눈 나머지를 한 줄에 출력한다.