Bi-ing Lottery Treekets
시간 제한1초메모리 제한1024 MB
N개 노드의 루트 이진 트리에 K개의 공을 떨어뜨려 만들 수 있는 서로 다른 당첨 티켓의 수를 10^9+7로 나눈 나머지를 구합니다.
문제
평행 우주에서는 모든 참가자가 CCO에서 만점을 받았다. 그래서 Troy는 복권으로 우승자를 정해야 한다. 각 참가자는 숫자를 골라 티켓을 만든다. 티켓은 크기가 인 배열이고, 인덱스는 부터 까지이다. 각 칸에는 부터 까지의 수가 들어간다.
당첨 티켓은 개의 공(번호는 부터 까지)을 무작위 순서로 루트가 있는 이진 트리에 떨어뜨려 정해진다. 트리에는 개의 노드(번호는 부터 까지)가 있고, 루트는 노드 이다.
각 공에는 떨어뜨릴 시작 노드가 정해져 있다. 공이 비어 있는 노드에 떨어지거나 비어 있는 노드로 들어가면 다음 세 경우 중 하나가 일어난다.
- 현재 노드의 자식이 모두 공으로 차 있거나 자식이 없으면, 공은 현재 노드에 멈춘다. 그 뒤로는 다시 움직이지 않는다.
- 현재 노드의 빈 자식이 하나뿐이면, 공은 그 자식으로 옮겨 간다.
- 현재 노드의 빈 자식이 둘이고 공이 방금 떨어진 것이라면, 공은 왼쪽이나 오른쪽 중 어느 쪽으로든 갈 수 있다. 그렇지 않으면 이전 이동 방향을 그대로 따라간다.
개의 공을 모두 떨어뜨리지 못하면 당첨 티켓은 정해지지 않는다. 공을 떨어뜨릴 노드가 이미 다른 공으로 차 있을 때 이런 일이 생긴다.
개의 공을 모두 떨어뜨리면, 공이 멈춘 위치로 당첨 티켓이 정해진다. 티켓의 번째 값은 노드 에 멈춘 공의 번호이고, 노드 에 멈춘 공이 없으면 이다.
Troy는 가능한 당첨 티켓이 몇 개인지 알고 싶어 한다. 0개일 수도 있다.
입력
첫 줄에는 이진 트리의 노드 수 과 공의 수 가 공백으로 구분되어 주어진다.
다음 줄에는 개의 정수가 공백으로 구분되어 주어진다. 번째 정수는 번호가 인 공을 떨어뜨릴 시작 노드이다.
마지막 개의 줄에는 각각 두 정수가 공백으로 구분되어 주어진다. 번째 줄에는 노드 의 왼쪽 자식 와 오른쪽 자식 가 주어진다. 값이 이면 해당 자식이 없다는 뜻이다.
출력
당첨 티켓의 개수를 로 나눈 나머지를 출력한다.
힌트
이진 트리는 비어 있거나, 루트 노드와 왼쪽 부분 트리, 오른쪽 부분 트리로 이루어진 노드의 집합이다. 이때 왼쪽 부분 트리와 오른쪽 부분 트리도 모두 이진 트리이다. 노드 의 왼쪽 부분 트리가 비어 있지 않으면, 그 부분 트리의 루트를 의 왼쪽 자식이라고 한다. 오른쪽 부분 트리도 같은 방식으로 의 오른쪽 자식이 된다.