Ініціалізація масиву
В багатьох мовах програмування є функції, які відповідають за заповнення усього масиву або деякої його частини певним значенням. У мові Pascal це функція fillchar(), у Java — Arrays.fill(), у C++ — memset(). У новій мові програмування J# з'явилась функція mark(), яка вміє працювати лише з масивами логічного типу.
Функція mark, викликана з двома параметрами a та b, присвоює усім елементам масиву з індексами від a до b включно значення true, Так, якщо взяти масив довжині 4, елементи якого пронумеровано з одиниці і усі значення у якому спочатку рівні false, і виконати з ним операції mark(1, 3) та mark(2, 4), то увесь масив виявиться заповнений значеннями true.
Одним з перших завдань для тех, хто починає вивчати J#, є написання програми, яка містить рівно M операцій mark, і повністю заповняє значеннями true масив довжини N, який спочатку заповнено значенями false.
Ви швидко впорались з цим завданням, і тепер задумались: скількома різними способами це можна зробити? Різними вважаються такі способи, у яких i-ту операцію mark у двох програмах запущено з різними параметрами хоча б для одного i від 1 до M. Це число може бути великим, тому потрібно порахувати його по модулю 10^9+7.
Вхідні дані
У першому рядку вхідного файлу задано два натуральних числа N та M — довжина масиву та кільксть операцій mark, які повинні бути у програмі (1 ≤ N, M ≤ 70).
Вихідні дані
У єдиному рядку вихідного файлу виведіть остачу від ділення числа способів заповнити масив з N елементів значеннями true при допомозі M викликів операції mark на число 10^9+7.
Пояснення до прикладу
Шукані варіанти:
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)