만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

트리 숫자 생성기

시간 제한13초메모리 제한1024 MB

요약
각 노드에 숫자가 적힌 트리에서 두 노드 a, b를 잇는 경로의 숫자를 이어 붙여 만든 정수를 m으로 나눈 나머지를 구하는 질의에 답한다.
난이도

어려움10점 중 8점

유형
트리, DFS, 수학, 정수론
정답자
아직 제출이 없습니다

문제

어느 날 영 안나는 트리를 이용해 숫자 생성기를 만드는 엉뚱한 생각을 떠올린다. 생성기는 법 m과 1번부터 n번까지 번호가 붙은 n개의 노드로 이루어진 내부 트리로 만들어진다. 트리의 각 노드에는 0부터 9까지의 한 자리 숫자가 하나씩 배정된다. 생성기는 [0, m) 범위의 정수를 만들어 내는 Get(a, b) 메서드를 제공한다. 두 인자 a와 b는 트리의 두 노드를 가리킨다. 생성기는 트리에서 a에서 b로 가는 경로를 따라가며, 경로 위의 모든 숫자(a와 b 노드의 숫자도 포함)를 이어 붙여 십진 정수 v를 얻는다. v는 매우 클 수 있고 앞에 0이 여러 개 붙을 수도 있다. Get(a, b)의 반환값은 v를 m으로 나눈 나머지이다.

트리와 안나의 숫자 생성기가 사용할 m이 주어질 때, q개의 질의 Get(a, b)의 반환값을 계산하라.

입력

입력의 첫 줄에는 세 정수 n (2 ≤ n ≤ 2 · 105), m (1 ≤ m ≤ 109), q (1 ≤ q ≤ 2 · 105)가 주어진다.

다음 n − 1개 줄에는 트리의 간선이 주어진다. 각 줄에는 간선이 잇는 두 정수 x, y (1 ≤ x, y ≤ n)가 주어진다. 이 간선들이 트리를 이룸이 보장된다.

다음 n개 줄에는 0부터 9까지의 한 자리 숫자가 하나씩 주어진다. i번째 숫자는 i번 노드에 배정된다.

다음 q개 줄에는 질의 Get(a, b)를 나타내는 두 정수 a, b (1 ≤ a, b ≤ n)가 주어진다.

출력

각 Get(a, b) 질의의 반환값을 한 줄에 하나씩 출력한다.

예제1

  1. 예제 1

    입력
    5 100 4
    1 2
    1 3
    1 4
    5 3
    1
    2
    3
    0
    4
    1 5
    5 1
    4 2
    3 3
    
    예상 출력
    34
    31
    12
    3