...Затем Вадим принялся писать ещё одно условие, как вдруг...
У некоторого контеста появилось N спонсоров, причём каждый из них хочет увидеть название своей компании в условиях ровно si различных задач. Однако участники этого контеста не хотят видеть в одном и том же условии отсылки более чем к 2-м различным спонсорам.
Жюри, несомненно, могут справиться с такими требованиями, но у них возник вопрос другого рода. Уже известно, что всего задач в контесте будет M, и как они расставлены между собой в комплекте. Теперь в любое из условий можно вписать названия не более двух компаний (например, «DOUBLETAPP» и «X-tensive»). Теперь же стало интересно, сколько способов существует это сделать. Два способа различаются, если у хотя бы одной задачи отличается набор упомянутых спонсоров.
Однако же сейчас жюри занято вписыванием спонсоров в условия, поэтому задача посчитать количество способов это сделать достаётся Вам.
Исходные данные
В первой строке даны два целых числа N и M — количество спонсоров у контеста и количество задач в комплекте (1 ≤ N ≤ 1000, 1 ≤ M ≤ 2000).
Во второй строке через пробел даны N целых чисел si — пожелания каждого спонсора (1 ≤ si ≤ M).
Гарантируется, что суммарное число пожеланий не превосходит 2 · M.
Результат
Выведите количество способов вписать названия компаний-спонсоров в комплект по модулю 109+7. То есть, найдите остаток при делении количества способов на 1 000 000 007.
Примеры
исходные данные | результат |
---|
2 2
1 1
| 4
|
5 13
1 1 1 1 1
| 351780
|
Замечания
В первом примере существует только четыре способа вписать названия спонсоров:
-
В первую задачу вписаны оба спонсора, во второй — ни одного;
-
В первую задачу никто не вписан, во вторую — оба;
-
В первую задачу вписан первый спонсор, во вторую — второй;
-
В первую задачу вписан второй спонсор, во вторую — первый.
Автор задачи: Вадим Баринов
Источник задачи: Уральская командная олимпиада по программированию 2022