// - Art -
#pragma GCC optimize("O3,unroll-loops") // O2
#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
#include <bits/stdc++.h>
#define el cout << '\n'
#define FOR(i, a, b) for (int i = (a), _b = (b); i <= _b; ++i)
#define REV(i, b, a) for (int i = (b), _a = (a); i >= _a; --i)
#define REP(i, c) for (int i = 0, _c = (c); i < _c; ++i)
const int N = 1e5 + 7;
const int MOD = 1e9 + 7;
void add(int &a, int b) {a += b; if (a >= MOD) a -= MOD;}
void sub(int &a, int b) {a -= b; if (a < 0) a += MOD;}
#define multi(a, b) (1ll * (a) * (b) % MOD)
#define div(a, b) (1ll * (a) * inverse(b) % MOD)
using namespace std;
int f[N];
int main() {
#define name "art"
if (fopen(name".inp", "r")) {
freopen(name".inp", "r", stdin);
freopen(name".out", "w", stdout);
}
ios_base::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
auto binpow = [&](int a, int b) -> int {
int res = 1;
while (b > 0) {
if (b & 1) {
res = multi(res, a);
}
a = multi(a, a);
b >>= 1;
}
return res;
};
auto num_trees = [&](int n) -> int {
return binpow(n, n - 2);
};
int n, k;
cin >> n >> k;
// => sz * (n-sz) <= k
// case: 1 * (n-1) <= k (k >= n-1 -> ok)
if (k == n - 1) {
cout << n, el;
return 0;
}
// best case: n/2 * (n-n/2) <= k -> n*n <= 4k
if (n * n - 4 * k <= 0) {
cout << num_trees(n), el;
return 0;
}
f[0] = f[1] = 1;
FOR (nodes, 2, n) {
f[nodes] = num_trees(nodes);
// cout << f[nodes], el;
if (nodes * nodes - 4 * k <= 0) {
continue;
}
// cout << nodes << ' ';
FOR (sz, 1, nodes) {
if (sz * (nodes - sz) <= k) {
continue;
}
sub(f[nodes], multi(multi(f[sz], f[nodes - sz]), sz * (nodes - sz)));
}
// el;
}
cout << f[n], el;
return 0;
}
Ly8gICAgICAtIEFydCAtCiNwcmFnbWEgR0NDIG9wdGltaXplKCJPMyx1bnJvbGwtbG9vcHMiKSAvLyBPMgojcHJhZ21hIEdDQyB0YXJnZXQoImF2eDIsYm1pLGJtaTIsbHpjbnQscG9wY250IikKI2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CgojZGVmaW5lIGVsICAgICAgICAgICAgICBjb3V0IDw8ICdcbicKCiNkZWZpbmUgRk9SKGksIGEsIGIpICAgIGZvciAoaW50IGkgPSAoYSksIF9iID0gKGIpOyBpIDw9IF9iOyArK2kpCiNkZWZpbmUgUkVWKGksIGIsIGEpICAgIGZvciAoaW50IGkgPSAoYiksIF9hID0gKGEpOyBpID49IF9hOyAtLWkpCiNkZWZpbmUgUkVQKGksIGMpICAgICAgIGZvciAoaW50IGkgPSAwLCBfYyA9IChjKTsgaSA8IF9jOyArK2kpCgpjb25zdCBpbnQgTiA9IDFlNSArIDc7CmNvbnN0IGludCBNT0QgPSAxZTkgKyA3OwoKdm9pZCBhZGQoaW50ICZhLCBpbnQgYikge2EgKz0gYjsgaWYgKGEgPj0gTU9EKSBhIC09IE1PRDt9CnZvaWQgc3ViKGludCAmYSwgaW50IGIpIHthIC09IGI7IGlmIChhIDwgMCkgYSArPSBNT0Q7fQojZGVmaW5lIG11bHRpKGEsIGIpICAgICAoMWxsICogKGEpICogKGIpICUgTU9EKQojZGVmaW5lIGRpdihhLCBiKSAgICAgICAoMWxsICogKGEpICogaW52ZXJzZShiKSAlIE1PRCkKCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgppbnQgZltOXTsKCmludCBtYWluKCkgewoKICAgICNkZWZpbmUgbmFtZSAiYXJ0IgogICAgaWYgKGZvcGVuKG5hbWUiLmlucCIsICJyIikpIHsKICAgICAgICBmcmVvcGVuKG5hbWUiLmlucCIsICJyIiwgc3RkaW4pOwogICAgICAgIGZyZW9wZW4obmFtZSIub3V0IiwgInciLCBzdGRvdXQpOwogICAgfQoKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwogICAgY2luLnRpZSgwKTsgY291dC50aWUoMCk7CgogICAgYXV0byBiaW5wb3cgPSBbJl0oaW50IGEsIGludCBiKSAtPiBpbnQgewogICAgICAgIGludCByZXMgPSAxOwogICAgICAgIHdoaWxlIChiID4gMCkgewogICAgICAgICAgICBpZiAoYiAmIDEpIHsKICAgICAgICAgICAgICAgIHJlcyA9IG11bHRpKHJlcywgYSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYSA9IG11bHRpKGEsIGEpOwogICAgICAgICAgICBiID4+PSAxOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzOwogICAgfTsKICAgIGF1dG8gbnVtX3RyZWVzID0gWyZdKGludCBuKSAtPiBpbnQgewogICAgICAgIHJldHVybiBiaW5wb3cobiwgbiAtIDIpOwogICAgfTsKCiAgICBpbnQgbiwgazsKICAgIGNpbiA+PiBuID4+IGs7CiAgICAvLyA9PiBzeiAqIChuLXN6KSA8PSBrCgogICAgLy8gY2FzZTogMSAqIChuLTEpIDw9IGsgKGsgPj0gbi0xIC0+IG9rKQogICAgaWYgKGsgPT0gbiAtIDEpIHsKICAgICAgICBjb3V0IDw8IG4sIGVsOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIC8vIGJlc3QgY2FzZTogbi8yICogKG4tbi8yKSA8PSBrIC0+IG4qbiA8PSA0awogICAgaWYgKG4gKiBuIC0gNCAqIGsgPD0gMCkgewogICAgICAgIGNvdXQgPDwgbnVtX3RyZWVzKG4pLCBlbDsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBmWzBdID0gZlsxXSA9IDE7CiAgICBGT1IgKG5vZGVzLCAyLCBuKSB7CiAgICAgICAgZltub2Rlc10gPSBudW1fdHJlZXMobm9kZXMpOwovLyAgICAgICAgY291dCA8PCBmW25vZGVzXSwgZWw7CiAgICAgICAgaWYgKG5vZGVzICogbm9kZXMgLSA0ICogayA8PSAwKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KLy8gICAgICAgIGNvdXQgPDwgbm9kZXMgPDwgJyAnOwogICAgICAgIEZPUiAoc3osIDEsIG5vZGVzKSB7CiAgICAgICAgICAgIGlmIChzeiAqIChub2RlcyAtIHN6KSA8PSBrKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdWIoZltub2Rlc10sIG11bHRpKG11bHRpKGZbc3pdLCBmW25vZGVzIC0gc3pdKSwgc3ogKiAobm9kZXMgLSBzeikpKTsKICAgICAgICB9CiAgICAgICAgLy8gZWw7CiAgICB9CiAgICBjb3V0IDw8IGZbbl0sIGVsOwoKICAgIHJldHVybiAwOwp9Cg==