Bir çox proqramlaşdırma dilində, bütün bir massivi və ya onun bir hissəsini müəyyən bir dəyərlə doldurmağa imkan verən funksiyalar mövcuddur. Pascal dilində bu funksiya fillchar(), Java dilində Arrays.fill(), C++ dilində isə memset() adlanır. Yeni J# proqramlaşdırma dilində isə yalnız məntiqi tipli massivlərlə işləyən mark() funksiyası təqdim edilib.
İki parametr a və b ilə çağırılan mark funksiyası, indeksləri a-dan b-yə qədər olan massiv elementlərinə true dəyərini təyin edir. Məsələn, uzunluğu 4 olan, elementləri birdən nömrələnmiş və başlanğıcda bütün dəyərləri false olan bir massiv götürsək və onun üzərində mark(1, 3) və mark(2, 4) əməliyyatlarını yerinə yetirsək, bütün massiv true dəyərləri ilə doldurulmuş olacaq.
J# dilini öyrənənlər üçün ilk tapşırıqlardan biri, dəqiq M mark əməliyyatını ehtiva edən və başlanğıcda false dəyərləri ilə doldurulmuş uzunluğu N olan bir massivi tamamilə true dəyərləri ilə dolduran bir proqram yazmaqdır.
Siz bu tapşırığı tez bir zamanda yerinə yetirdiniz və indi düşünürsünüz: bunu neçə fərqli üsulla etmək olar? Fərqli üsullar, iki proqramda i-ci mark əməliyyatının ən azı bir i üçün 1-dən M-ə qədər olan parametrlərlə fərqli şəkildə başladığı üsullardır. Bu rəqəm böyük ola bilər, buna görə də onu 10^9+7 moduluna görə hesablamaq lazımdır.
Giriş faylının ilk sətirində iki natural ədəd N və M verilmişdir — massiv uzunluğu və proqramda olmalı olan mark əməliyyatlarının sayı (1 ≤ N, M ≤ 70).
Çıxış faylının yeganə sətirində M mark əməliyyatlarının köməyi ilə N elementli massivi true dəyərləri ilə doldurma üsullarının sayının 10^9+7 moduluna görə qalıqını çıxarın.
Misal üçün izah
Axtarılan variantlar:
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)
Nümunə 1