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

Задача . F. Контроль успеваемости


Задача

Темы: Деревья дп *2300

На одной из своих контрольных работ по информатике Дмитрий Олегович решил дать следующую задачу:

Пусть дано дерево T на n вершинах, заданное своей матрицей смежности a[1... n, 1... n]. Какую последовательность чисел выведет следующий псевдокод?


used[1 ... n] = {0, ..., 0};

procedure dfs(v):
print v;
used[v] = 1;
for i = 1, 2, ..., n:
if (a[v][i] == 1 and used[i] == 0):
dfs(i);

dfs(1);

Чтобы было легче проверять работы студентов, Дмитрий Олегович решил придумать такое дерево T, чтобы в ответе получилась его любимая последовательность b. С другой стороны, Дмитрий Олегович не хочет давать студентам одинаковые данные в контрольной работе — ведь в таком случае не миновать списывания. Поэтому у Дмитрия Олеговича возник следующий вопрос: сколько существует таких деревьев, что при запуске данного псевдокода на них выведенная последовательность в точности совпадает с последовательностью b?

Два дерева на n вершинах считаются различными, если их матрицы смежности a1 и a2 не совпадают, то есть существует такая пара (i, j), что 1 ≤ i, j ≤ n и a1[i][j] ≠ a2[i][j].

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

В первой строке задано натуральное число n (1 ≤ n ≤ 500) — количество чисел в последовательности b.

Во второй строке задаются n натуральных чисел b1, b2, ..., bn (1 ≤ bi ≤ n), разделенные пробелом. Гарантируется, что последовательность b является перестановкой. Иными словами, каждое из чисел 1, 2, ..., n встречается в последовательности b ровно один раз. Также гарантируется, что b1 = 1.

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

Выведите одно число — остаток от деления количества подходящих деревьев на 109 + 7.


Примеры
Входные данныеВыходные данные
1 3
1 2 3
2
2 3
1 3 2
1

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

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