ENG  RUSTimus Online Judge
Online Judge
Задачи
Авторы
Соревнования
О системе
Часто задаваемые вопросы
Новости сайта
Форум
Ссылки
Архив задач
Отправить на проверку
Состояние проверки
Руководство
Регистрация
Исправить данные
Рейтинг авторов
Текущее соревнование
Расписание
Прошедшие соревнования
Правила

2169. Градостроение 2

Ограничение времени: 2.0 секунды
Ограничение памяти: 256 МБ
Ничто так не расслабляет Валю после подготовки тяжёлого контеста, как залипнуть в симулятор градостроения на весь вечер. Это происходит уже не в первый раз, поэтому у Вали есть большой город с многочисленными жителями и хорошей инфраструктурой. Сегодня Валя собирается добавить новое здание — первый в городе музей. Можно ожидать, что на открытие придёт много жителей. Поэтому нужно будет поставить ограждения, чтобы не создать давку. Ограждения понадобятся и внутри музея... На всё это уйдёт много время, поэтому Валя решил автоматизировать процесс, написав программу.
В игре доступны стойки с ограничительными лентами. Каждая такая стойка имеет 4 слота: из одного слота вытягивается лента, а 3 других слота свободны, и в них можно вставить ленту. Ленту можно натянуть между двумя стойками, вытянув её из одной стойки и вставив в свободный слот другой. Таким образом можно создавать сложные конструкции из лент.
Валина программа принимает на ввод план ограждений: он имеет вид графа из N вершин и M рёбер. В этом графе вершины соответствуют стойкам, а рёбра — исходящим из них лентам. Стойки пронумерованы от 1 до N. Только вот одному и тому же плану может соответствовать несколько конфигураций из лент. Помогите Вале реализовать функциональность, которая бы считала количество различных способов натянуть ленты так, чтобы получить данный граф.
Будем считать, что ленту можно натянуть только между двумя различными стойками, то есть петли в графе запрещены. Из каждой стойки можно вытянуть одну ленту, или не вытягивать ленту вовсе. В каждую стойку можно вставить не более трёх лент. Скажем также, что нельзя создавать кратные рёбра: то есть, нельзя провести ленту одновременно из стойки A в стойку B и из стойки B в стойку A.
Два способа считаются различными, если есть пара стоек (A, B) такая, что в одном из способов лента из стойки A вставлена в стойку B, а в другом — нет. При этом слот, куда вставлена лента, не имеет значения: способы, различающиеся только выбором слотов, считаются одинаковыми.

Исходные данные

В первой строке через пробел даны два числа N и M — количество вершин и рёбер в плане ограждений (1 ≤ N ≤ 105, 0 ≤ M ≤ 105).
Далее идёт M строк, описывающие рёбра. В каждой строке через пробел даны два числа ai, bi — номера вершин, соединённых ребром (1 ≤ ai, biN).
Гарантируется, что в графе нет петель и кратных рёбер.

Результат

Выведите единственное число — количество способов натянуть ленты между перегородками так, чтобы получить данный граф, по модулю 109 + 7.

Примеры

исходные данныерезультат
5 4
1 2
1 3
1 4
1 5
4
6 4
1 2
1 3
2 3
4 5
4
Автор задачи: Валентин Зуев
Источник задачи: Уральская командная олимпиада по программированию 2022