이진 트리
시간 제한: 1000ms메모리 제한: 1024MB출처: KOI 2024 1차BOJ 31966
문제
모든 노드의 자식 노드가 개 또는 개인 이진 트리 에 대해 의 값은 다음과 같이 정의한다.
- 에서 노드 를 루트로 하는 서브 트리는, 와 의 자손 노드들로만 구성된 집합이다.
- 의 중위 순회 수열 는 를 중위 순회하면서 방문하는 노드들을 순서대로 나열한 수열로, 아래와 같이 정의할 수 있다.
- 의 루트 노드를 이라 하자. 을 하나로만 구성된 길이 의 수열이라고 하자.
- 만약 의 자식 노드가 개라면, 는 이다.
- 만약 의 자식 노드가 개라면, 의 왼쪽 자식 노드를 루트로 하는 서브 트리가 , 의 오른쪽 자식 노드를 루트로 하는 서브 트리가 일 때, 는 , , 을 순서대로 이어붙인 수열이다.
- 의 리프 노드 개수를 라고 하자. 의 리프 노드들에 의 번호를 에서 나타나는 순서대 로 (즉, 중위 순회 방문 순서대로) 붙였다고 하자.
- 의 서브 트리를 선택하면, 해당 서브 트리에 포함된 리프 노드들이 덮인다고 하자.
- 1 ≤ a ≤ b ≤ k일 때, 는 리프 노드들 중 번호가 이상 이하인 리프 노드들만을 덮고 다른 리프 노드들은 덮지 않기 위해, 에서 선택해야 하는 최소 서브 트리 개수이다.
- 의 값은 1 ≤ a ≤ b ≤ k인 모든 정수 순서쌍에 대한 의 합을 로 나눈 나머지이다.
예를 들어, 다음과 같은 이진 트리 가 있다고 가정해보자.
| (a) 만든 트리 | (b) 리프 노드에 번호를 붙인 트리 |
의 값은 이다. 다음과 같이 서브 트리 두 개를 선택하면 , , 번 리프 노드만 덮이기 때문이다.
이런 식으로 모든 1 ≤ a ≤ b ≤ 7에 대해 의 값의 합은 이고, 이를 로 나눈 나머지를 구하면 이다.
정수열 과 이 주어진다.
이진 트리 을 다음과 같이 정의한다.
- 은 노드가 개인 트리
- 는 루트의 왼쪽 자식 노드를 루트로 하는 서브 트리가 이고, 루트의 오른쪽 자식 노드를 루트로 하는 서브 트리가 인 트리 (1 ≤ i ≤ N, 0 ≤ A_i ≤ i - 1, 0 ≤ B_i ≤ i - 1)
을 구하는 프로그램을 작성하라.
입력
첫 번째 줄에 정수 이 주어진다.
다음 개의 줄 중 (1 ≤ i ≤ N)번째 줄에는 와 가 공백으로 구분되어 주어진다.
출력
개의 줄을 출력한다. (1 ≤ i ≤ N)번째 줄에는 를 출력해야 한다.
예제
예제 1
입력
5 0 0 1 0 1 2 3 1 4 4
출력
3 7 21 47 254
예제 2
입력
7 0 0 1 1 2 2 3 3 4 4 5 5 6 6
출력
3 13 65 337 1729 8641 41985
코드를 제출하려면 로그인하세요.