Ініціалізація масиву#3906

Ініціалізація масиву

2 секунди
256 мегабайтів
Складна

В багатьох мовах програмування є функції, які відповідають за заповнення усього масиву або деякої його частини певним значенням. У мові Pascal це функція fillchar(), у Java — Arrays.fill(), у C++ — memset(). У новій мові програмування J# з'явилась функція mark(), яка вміє працювати лише з масивами логічного типу.

Функція mark, викликана з двома параметрами та , присвоює усім елементам масиву з індексами від до включно значення . Так, якщо взяти масив довжини , елементи якого пронумеровано з одиниці і усі значення у якому спочатку рівні , і виконати з ним операції mark(1, 3) та mark(2, 4), то увесь масив виявиться заповнений значеннями .

Одним з перших завдань для тих, хто починає вивчати J#, є написання програми, яка містить рівно операцій , і повністю заповнює значеннями масив довжини , який спочатку заповнено значеннями .

Ви швидко впорались з цим завданням, і тепер задумались: скількома різними способами це можна зробити? Різними вважаються такі способи, у яких -ту операцію у двох програмах запущено з різними параметрами хоча б для одного від до . Це число може бути великим, тому потрібно порахувати його по модулю 10^9 + 7.

Вхідні дані

У першому рядку вхідного файлу задано два натуральних числа та — довжина масиву та кількість операцій , які повинні бути у програмі (1 \leq N, M \leq 70).

Вихідні дані

У єдиному рядку вихідного файлу виведіть остачу від ділення числа способів заповнити масив з елементів значеннями за допомогою викликів операції на число 10^9 + 7.

Приклади

Приклад 1

Loading
Loading

Примітка

Шукані варіанти:

  • mark(1, 1); mark(1, 2)

  • mark(1, 1); mark(2, 2)

  • mark(1, 2); mark(1, 1)

  • mark(1, 2); mark(1, 2)

  • mark(1, 2); mark(2, 2)

  • mark(2, 2); mark(1, 1)

  • mark(2, 2); mark(1, 2)