60021 이진 트리
문제
모든 노드의 자식 노드가 개 또는 개인 이진 트리 에 대해 의 값은 다음과 같이 정의한다.
- 에서 노드 를 루트로 하는 서브 트리는, 와 의 자손 노드들로만 구성된 집합이다.
- 의 중위 순회 수열 는 를 중위 순회하면서 방문하는 노드들을 순서대로 나열한 수열로, 아래와 같이 정의할 수 있다.
- 의 루트 노드를 이라 하자. 을 하나로만 구성된 길이 의 수열이라고 하자.
- 만약 의 자식 노드가 개라면, 는 이다.
- 만약 의 자식 노드가 개라면, 의 왼쪽 자식 노드를 루트로 하는 서브 트리가 , 의 오른쪽 자식 노드를 루트로 하는 서브 트리가 일 때, 는 , , 을 순서대로 이어붙인 수열이다.
- 의 리프 노드 개수를 라고 하자. 의 리프 노드들에 의 번호를 에서 나타나는 순서대 로 (즉, 중위 순회 방문 순서대로) 붙였다고 하자.
- 의 서브 트리를 선택하면, 해당 서브 트리에 포함된 리프 노드들이 덮인다고 하자.
- 일 때, 는 리프 노드들 중 번호가 이상 이하인 리프 노드들만을 덮고 다른 리프 노드들은 덮지 않기 위해, 에서 선택해야 하는 최소 서브 트리 개수이다.
- 의 값은 인 모든 정수 순서쌍에 대한 의 합을 로 나눈 나머지이다.
예를 들어, 다음과 같은 이진 트리 가 있다고 가정해보자.
![]() | ![]() |
|---|---|
| (a) 만든 트리 | (b) 리프 노드에 번호를 붙인 트리 |
의 값은 이다. 다음과 같이 서브 트리 두 개를 선택하면 , , 번 리프 노드만 덮이기 때문이다.

이런 식으로 모든 에 대해 의 값의 합은 이고, 이를 로 나눈 나머지를 구하면 이다.
정수열 과 이 주어진다.
이진 트리 을 다음과 같이 정의한다.
- 은 노드가 개인 트리
- 는 루트의 왼쪽 자식 노드를 루트로 하는 서브 트리가 이고, 루트의 오른쪽 자식 노드를 루트로 하는 서브 트리가 인 트리 (, , )
을 구하는 프로그램을 작성하라.
입력
첫 번째 줄에 정수 이 주어진다.
다음 개의 줄 중 ()번째 줄에는 와 가 공백으로 구분되어 주어진다.
출력
개의 줄을 출력한다. ()번째 줄에는 를 출력해야 한다.
제한
- 주어지는 모든 수는 정수이다.
- ()
- ()
서브태스크
| 1 | 5 | (), |
|---|---|---|
| 2 | 10 | () |
| 3 | 5 | , () |
| 4 | 10 | 의 노드 개수의 합은 이하 |
| 5 | 25 | 의 노드 개수의 합은 이하 |
| 6 | 45 | 추가 제약 조건 없음. |
힌트
예제 1
위 예제에서 는 아래 그림과 같다.

예제 입출력
예제 입력 1
5
0 0
1 0
1 2
3 1
4 4
예제 출력 1
3
7
21
47
254
예제 입력 2
7
0 0
1 1
2 2
3 3
4 4
5 5
6 6
예제 출력 2
3
13
65
337
1729
8641
41985
출처
올림피아드 › 한국정보올림피아드 › KOI 2024 1차 › 중등부 3번 › 고등부 2번
solution.cpp
에디터 불러오는 중...

