DFS
시간 제한8초메모리 제한1024 MB
뿌리가 있는 트리에서 정점 값을 이용해 y가 x의 부분트리에 있는 모든 쌍 (x, y)에 대해, 무작위 DFS 스택에 들어간 값의 최솟값 기댓값을 모두 더한 합을 998244353으로 나눈 나머지로 구합니다.
문제
루트가 있는 트리가 정점 개로 주어지며, 은 트리의 루트이다. 각 정점 의 값은 이다.
정점 에서 시작해 를 찾는 DFS 과정을 다음과 같이 정의한다.
- 를 스택에 넣는다.
- 스택의 맨 위 원소 를 확인한다. 이면 과정이 끝난다. 그렇지 않고 의 방문하지 않은 자식이 하나 이상 있으면, 그중 하나를 같은 확률로 골라 스택에 넣는다.
- 방문하지 않은 자식이 없을 때까지 2단계를 반복한다.
- 스택의 맨 위 원소를 꺼낸다.
- 스택이 빌 때까지 2단계를 반복한다.
이 과정은 가 의 서브트리에 속할 때에만 합법이다.
는 에서 시작해 를 찾는 DFS 과정 동안 스택에 한 번이라도 들어간 모든 정점 값의 최솟값의 기댓값이다.
이제 모든 합법적인 쌍 에 대해 를 구한다. 답은 기약분수 로 나타낼 수 있으며, 와 는 정수이고 이다. 의 값을 출력한다. 즉, 이고 을 만족하는 정수 를 출력한다.
입력
첫 줄에 테스트 케이스 수 ()가 주어진다.
각 테스트 케이스의 첫 줄에는 정점 수 과 루트 (, )이 주어진다.
다음 줄에는 개의 정수가 주어지며, 번째 정수는 정점 의 값 ()이다.
이어서 개의 줄에 간선을 나타내는 정수 , ()가 주어진다.
이며, 주어진 그래프는 트리이다.
출력
각 테스트 케이스의 답을 한 줄에 하나씩 출력한다.