1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <bits/stdc++.h>
#define pb push_back
#define pp pop_back
#define sz size()
const long long M=1000000007;

using namespace std;

int n,m;
vector <int> t;
vector <bool> d(1,1);

long long rec(int k=1) {
	if ((int)t.sz==n) {

		return d.back();

	} else {

		long long w=0;
		for (int i=1; i<=k; i++) {
			t.pb(i);
			d.pb(0);
			for (int j=0; j<(int)d.sz-2; j++) {
				if (t[j]==t.back() && d[j]) {
					d.back()=1;
					break;
				}
			}
			w+=rec(min(max(i+1,k),m));
			if (w>=M) w-=M;
			d.pp();
			t.pp();
		}
		return w;

	}
}

int main() {
	scanf("%d %d",&n,&m);

	long long w=1;
	for (int i=2; i<=m; i++) {
		w*=i;
		w%=M;
	}
	w*=rec();
	w%=M;

	printf("%lld\n",w);
	return 0;
}