Инициализация массива

아직 제출이 없습니다시간 제한2초메모리 제한512 MB

문제

Во многих языках программирования есть функции, которые отвечают за заполнение всего массива или некоторой его части определенным значением. В языке Pascal это функция fillchar(), в Java --- Arrays.fill(), в C++ --- memset(). В новом языке программирования J\# появилась функция mark(), которая умеет работать только с массивами логического типа.

Функция mark, вызванная от двух параметров aa и bb, присваивает всем элементам массива с индексами от aa до bb включительно значение true, Так, если взять массив длины 4, элементы которого нумеруются с единицы и все значения в котором изначально равны false, и выполнить с ним операции mark(1, 3) и mark(2, 4), то весь массив окажется заполнен значениями true.

Одним из первых заданий для тех, кто начинает изучать J\#, является написание программы, содержащей ровно MM операций mark, и полностью заполняющей значениями true массив длины  NN, изначально заполненный значениями false.

Вы быстро справились с этим заданием, и теперь задумались: сколькими различными способами это можно сделать? Различными считаются такие способы, в которых ii-я операция mark в двух программах запущена с разными параметрами хотя бы для одного ii от 1 до MM. Это число может быть большим, поэтому требуется посчитать его по модулю 109+710^9+7.

입력

В первой строке входного файла даны два натуральных числа NN и MM --- длина массива и количество операций mark, которые должны быть в программе. (1N,M701 \le N, M \le 70).

출력

В единственной строке выходного файла выведите остаток от деления числа способов заполнить массив из NN элементов значениями true с помощью MM вызовов операции mark на число 109+710^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)