Олимпиадный тренинг

Задача . E. Отправьте дерево Чарли


Рождество постучало в дверь, и наш главный герой, Боб, готовил захватывающий подарок для своего давнего второго лучшего друга Чарли. Поскольку ему не нравится шоколад, он решил вместо этого украсить дерево. Дерево Боба можно представить в виде неориентированного связного графа с \(n\) вершинами (пронумерованными от \(1\) до \(n\)) и \(n-1\) ребрами. Первоначально Боб поместил украшение с номером \(i\) на вершину \(i\) для каждого \(1 \le i \le n\). Однако, поскольку такая простая композиция получилась некрасивой, он решил немного переместить украшения. Формально Боб сделал следующие шаги:

  • Сначала он выписал все \(n-1\) ребра в некотором порядке.
  • Затем он рассмотрел все ребра один за другим в таком порядке. Для каждого ребра \((u, v)\) он поменял местами украшение вершины \(u\) с украшением вершины \(v\).

После этого Боб оказался довольным такой аранжировкой и пошел спать.

На следующее утро Боб просыпается, только чтобы узнать, что его прекрасная аранжировка разрушена! Прошлой ночью младший брат Боба, Бобо, бросил некоторые украшения на пол, когда играл с деревом. К счастью, украшения не были потеряны, поэтому Боб может восстановить дерево в кратчайшие сроки. Однако он полностью забыл, как дерево выглядело вчера. Поэтому, учитывая номера украшений, которые все еще на дереве, Боб хочет узнать количество возможных конфигураций дерева. Поскольку результат может быть довольно большим, Боб будет рад, если вы сможете вывести результат по модулю \(1000000007\) (\(10^9+7\)). Обратите внимание, что, возможно, не существует никаких возможных конфигураций.

Входные данные

Первая строка содержит одно целое число \(n\) (\(2 \leq n \leq 500\,000\)) — количество вершин.

Каждая из следующих \(n - 1\) строк содержит два целых числа \(u\) и \(v\) (\(1 \leq u, v \leq n\)), которые обозначают, что существует ребро между вершинами \(u\) и \(v\). Гарантируется, что граф — дерево.

Последняя строка содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(0 \le a_i \le n\)). Для каждого \(i\), \(a_i = 0\) значит, что украшение вершины \(i\) было сброшено. Иначе \(a_i\) обозначает номер украшения, что находится в вершине \(i\). Гарантируется, что каждый номер встречается не более одного раза.

Выходные данные

Выведите количество конфигураций по модулю \(1000000007\) (\(10^9+7\)).

Примечание

В первом примере возможными конфигурациями дерева являются \([2, 4, 1, 3]\) и \([3, 4, 2, 1]\).

Во втором примере обратите внимание, что есть \(4! = 24\) возможных перестановок ребер, но возможны только \(12\) различные финальные конфигурации.

В третьем примере легко увидеть, что украшение с номером \(1\) не может оставаться в вершине \(1\) после перестановок.


Примеры
Входные данныеВыходные данные
1 4
3 4
2 4
4 1
0 4 0 0
2
2 5
1 2
2 4
3 4
5 4
0 0 0 0 0
12
3 3
1 2
1 3
1 0 0
0

time 4000 ms
memory 512 Mb
Правила оформления программ и список ошибок при автоматической проверке задач

Статистика успешных решений по компиляторам
 Кол-во
С++ Mingw-w645
Комментарий учителя