다음과 같이 트리를 만들자. 먼저 번 정점을 루트로 두자. 그 다음, 인 모든 정수 에 대해 작은 수부터 차례대로, 번 정점을 번 정점의 자식 정점으로 두자. 여기서, 는 을 로 나눈 몫을 뜻한다. 이러한 트리는 번부터 번까지 총 개의 정점을 가지며, 모든 정점은 최대 개의 자식 정점을 갖는다.
이제 우리는 이 트리의 각 정점마다, 이 정점이 루트가 되는 부분 트리의 크기를 생각해 보려고 한다. 트리의 크기는 이 트리에 포함되는 정점의 개수이다.
예를 들어, 아래와 같이 인 경우의 트리를 생각해 보자.

각 정점마다 이 정점이 루트가 되는 부분 트리의 크기는 다음과 같다.
- 번 정점이 루트가 되는 부분 트리의 크기는 이다.
- 번 정점이 루트가 되는 부분 트리의 크기는 이다.
- , , 번 정점이 루트가 되는 부분 트리의 크기는 이다.
따라서, 각각의 정점이 루트가 되는 부분 트리의 크기의 합은 이다.
이 값이 매우 커질 수 있으므로, 우리는 이 값을 로 나눈 나머지를 알고 싶다.
가 주어졌을 때, 각각의 정점이 루트가 되는 부분 트리의 크기의 합을 로 나눈 나머지를 구하는 프로그램을 작성하라.
입력 형식
첫 줄에 테스트 케이스의 수를 나타내는 정수 가 주어진다. ()
그다음 줄 각각마다 테스트케이스에 대한 정보가 주어진다. 각 줄에는 트리의 정점 수, 정점의 최대 자식 수, 나누는 수를 나타내는 세 정수 가 공백으로 구분되어 차례대로 주어진다. ( )
출력 형식
각 테스트 케이스의 결과를 한 줄에 출력한다. 출력은 테스트 케이스에서 주어진 트리의 각 정점이 루트가 되는 서브트리의 크기의 총합을 주어진 로 나눈 나머지이다.
예제 1
입력
1 5 2 17
출력
11
예제 2
입력
3 13 3 37 13 3 13 13 3 5
출력
34 8 4
예제 설명
- 예제 1에 대한 설명은 문제 본문에 주어져 있다.
- 예제 2에서는 첫 레벨에 정점 개, 둘째 레벨에 정점 개, 셋째 레벨에 정점 개가 있다.
- 첫 레벨에 있는 정점이 루트가 되는 서브트리의 크기의 합은 ,
- 둘째 레벨에 있는 정점이 루트가 되는 서브트리의 크기의 합은 ,
- 셋째 레벨에 있는 정점이 루트가 되는 서브트리의 크기의 합은 .
- 따라서, 총합은 이며, 이를 각각 , , 로 나눈 나머지는 각각 , , 이다.
채점 방식
입력 케이스들은 다음과 같은 종류로 구별되며, 한 종류의 케이스를 다 맞혀야 그 종류에 배정된 점수를 받을 수 있다.
종류 1: 17점
모든 테스트 케이스에서의 의 합은 이하이다.
종류 2: 16점
모든 테스트 케이스에서의 가 모두 같다.
종류 3: 20점
종류 4: 22점
종류 5: 25점
모든 입력 케이스가 주어진다.
해설
모든 부분 트리의 크기의 총합을 계산할 때, 각 정점이 세지는 횟수는 그 정점의 깊이와 같습니다. 따라서, 모든 정점의 깊이의 총합은 정답과 같습니다.
이제, 각 높이 에 대해, 높이가 인 정점의 개수를 셉시다. 의 높이에는 루트 정점 하나만 있으며, 높이가 증가할 때마다, 총 정점 개수 을 넘지 않은 선에서, 정점의 수는 배가 됩니다. 따라서 모든 높이에 대해 정점 개수를 에 계산할 수 있습니다.
인 경우는 정답이 이므로 예외적으로 처리해야 합니다. 이때, 가 이상의 짝수가 될 수 있음에 유의해야 합니다.