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

Задача . F. Соедини вершины


Задача

Темы: графы дп *2500

На плоскости отмечены n точек. Точки расположены таким образом, чтобы они образуют правильный многоугольник (отмеченные точки — его вершины, и они пронумерованы по обходу против часовой стрелки). Вам необходимо провести n - 1 отрезков, каждый должен соединять две отмеченные точки, так, чтобы любая точка была достижима из любой другой по некоторому пути из отрезков.

Однако есть некоторые ограничения. Во-первых, некоторые пары точек не могут быть соединены отрезком напрямую. Во-вторых, проведенные отрезки могут касаться только в какой-либо из отмеченных точек (то есть, если на рисунке отрезки пересекаются, и их пересечение не является одной из отмеченных точек, то рисунок некорректный).

Сколько существует способов соединить все вершины, используя n - 1 отрезок? Два способа считаются различными, когда есть такая пара вершин, между которыми есть отрезок в первом способе, но нет во втором. Так как ответ может быть велик, выведите его по модулю 109 + 7.

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

В первой строке записано одно целое число n (3 ≤ n ≤ 500) — количество отмеченных точек.

Затем идут n строк, в каждой по n элементов. ai, j (j-й элемент строки i) равен 1, если точки i и j можно соединить отрезком напрямую (иначе ai, j = 0). Гарантируется, что для любой пары точек ai, j = aj, i, и для любой точки ai, i = 0.

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

Выведите количество способов соединить точки по модулю 109 + 7.


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

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

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