트리의 팔
시간 제한5초메모리 제한512 MB
트리와 루트가 주어질 때, 루트에서 두 리프까지의 거리 합이 [W, V]에 들어오는 순서쌍의 개수를 각 쿼리마다 1e9+7로 나눈 나머지를 구한다.
문제
트리에 팔을 만들어주자.
트리의 팔을 다음과 같이 정의하자.
- 임의의 트리 에 대해 트리의 양팔은 루트 노드 에서 도달 가능한 리프노드 , 한 쌍을 의미한다. 즉, 트리의 양팔은 리프노드 순서쌍 이다.
- 트리의 양팔이 일 때, 왼쪽 팔은 이고 오른쪽 팔은 이다.
- 오른팔과 왼팔은 같을 수 있다. 즉, 도 유효한 양팔이다.
- 이때, 어떤 한쪽 팔의 길이는 루트 노드 에서부터의 최단 거리로 정의한다.
어떤 트리 가 주어졌을 때, 해당 트리가 가질 수 있는 양팔을 라고 했을 때, 양팔의 길이의 합이 이상 이하가 되는 순서쌍 의 개수를 구하는 개의 쿼리를 처리해보자.
입력
첫 번째 줄에 트리의 정점 개수 , 루트 노드의 번호 이 주어진다.
두 번째 줄부터 개의 줄에 걸쳐 연결된 두 정점 가 공백으로 구분되어 주어진다.
번째 줄에는 처리해야할 쿼리의 개수 가 주어진다.
번째 줄부터 한 줄에 쿼리가 하나씩 주어진다. 각 쿼리의 가 공백으로 구분되어 들어오는 형태이다.
출력
양팔의 길이 합이 이상 이하가 되는 순서쌍 의 개수를 구해 로 나눈 나머지를 쿼리별로 한 줄마다 출력한다.