#include <bits/stdc++.h>
using namespace std;
#define print(x) cout << "[" << (x) << "]"
const int N = 1e5 + 5 ;
const int B = 605 ;
using ll = long long ;
const ll mod = 1e9 + 7 ;
ll fac[ 2 * N] , inv[ 2 * N] ;
ll Exp( ll a, ll b) {
if ( ! b) return 1LL;
ll tmp = Exp( a, b / 2 ) ;
tmp = tmp * tmp % mod;
if ( b & 1 ) tmp = tmp * a % mod;
return tmp;
}
ll Euler( int m, int n) {
return fac[ n + m - 1 ] * inv[ n - 1 ] % mod * inv[ m] % mod;
}
void add( ll & x, ll y) {
x + = y;
if ( x >= mod) x - = mod;
}
int n, k;
ll dp[ B] [ N] , f[ 2 ] [ N] ;
int main( ) {
fac[ 0 ] = 1 ;
for ( int i = 1 ; i <= 2 * N - 5 ; i++ )
fac[ i] = fac[ i - 1 ] * i % mod;
inv[ 2 * N - 5 ] = Exp( fac[ 2 * N - 5 ] , mod - 2 ) ;
for ( int i = 2 * N - 6 ; i >= 0 ; i-- )
inv[ i] = inv[ i + 1 ] * ( i + 1 ) % mod;
cin >> n >> k;
dp[ 0 ] [ 0 ] = 1 ;
f[ 0 ] [ 0 ] = 1 ;
for ( int i = 1 ; i <= min( n, B - 5 ) ; i++ ) {
for ( int j = 1 ; j <= k; j++ ) {
if ( j >= i) add( dp[ i] [ j] , ( dp[ i] [ j - i] + dp[ i - 1 ] [ j - i] ) % mod) ;
if ( j >= n + 1 ) dp[ i] [ j] = ( dp[ i] [ j] - dp[ i - 1 ] [ j - n - 1 ] + mod) % mod;
add( f[ i & 1 ] [ j] , dp[ i] [ j] ) ;
}
}
ll ans = 0 ;
for ( int i = 0 ; i <= k; i++ ) {
add( ans, Euler( k - i, n) * ( f[ 0 ] [ i] - f[ 1 ] [ i] + mod) % mod) ;
}
cout << ans;
}
/*
dua bai toan ve tim so day a[] sao cho a[i] < i va tong day = k
- ta dem so day bang bao ham loai tru :
mot day khong thoa man khi ton tai a[i] >= i
nhu vay neu ta nhin duoi dang bitmask n phan tu voi phan tu i bat <=> a[i] >= i bai toan se tro ve bai dem so so nguyen to cung nhau voi x
xet day gom n phan tu a[i] = i, goi dp[i][j] la so cach de tao ra tong j tu i phan tu trong day a[], goi f[0/1][j] lan luot la so cach tao ra tong j tu chan / le phan tu trong day a[]
tu day ta co cong thuc ans = tong (chiakeo(k - x, n) * (f[0][x] - f[1][x]) voi moi 0 <= x <= k)
** cach tinh mang dp **
cong thuc : dp[i][j] = dp[i][j - i] + dp[i - 1][j - i] - dp[i - 1][j - (n + 1)];
dp[i][j - i] -> dp[i][j] la dat mot thanh nam ngang do dai i duoi i phan tu dang co
dp[i - 1][j - i] -> dp[i][j] la dat mot thanh nam ngang do dai i + 1 duoi i phan tu dang co va tao ra them phan tu thu i + 1
- dp[i - 1][j - (n + 1)] la de loai di cac trang thai ma sau khi dat cac thanh ngang thi xuat hien phan tu lon nhat = (n + 1) (cac phan tu nay bi loai vi day a[] co a[i] = i)
*/
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgcHJpbnQoeCkgY291dCA8PCAiWyIgPDwgKHgpIDw8ICJdIgpjb25zdCBpbnQgTiA9IDFlNSArIDU7CmNvbnN0IGludCBCID0gNjA1Owp1c2luZyBsbCA9IGxvbmcgbG9uZzsKY29uc3QgbGwgbW9kID0gMWU5ICsgNzsKbGwgZmFjWzIqTl0sIGludlsyKk5dOwpsbCBFeHAobGwgYSwgbGwgYikgewogICAgaWYgKCFiKSByZXR1cm4gMUxMOwogICAgbGwgdG1wID0gRXhwKGEsIGIgLyAyKTsKICAgIHRtcCA9IHRtcCAqIHRtcCAlIG1vZDsKICAgIGlmIChiICYgMSkgdG1wID0gdG1wICogYSAlIG1vZDsKICAgIHJldHVybiB0bXA7Cn0KCmxsIEV1bGVyKGludCBtLCBpbnQgbikgewogICAgcmV0dXJuIGZhY1tuICsgbSAtIDFdICogaW52W24gLSAxXSAlIG1vZCAqIGludlttXSAlIG1vZDsKfQoKdm9pZCBhZGQobGwgJngsIGxsIHkpIHsKICAgIHggKz0geTsKICAgIGlmICh4ID49IG1vZCkgeCAtPSBtb2Q7Cn0KCmludCBuLCBrOwpsbCBkcFtCXVtOXSwgZlsyXVtOXTsKaW50IG1haW4oKSB7CiAgICBmYWNbMF0gPSAxOwogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gMiAqIE4gLSA1OyBpKyspCiAgICAgICAgZmFjW2ldID0gZmFjW2kgLSAxXSAqIGkgJSBtb2Q7CiAgICBpbnZbMiAqIE4gLSA1XSA9IEV4cChmYWNbMiAqIE4gLSA1XSwgbW9kIC0gMik7CiAgICBmb3IgKGludCBpID0gMiAqIE4gLSA2OyBpID49IDA7IGktLSkKICAgICAgICBpbnZbaV0gPSBpbnZbaSArIDFdICogKGkgKyAxKSAlIG1vZDsKICAgIGNpbiA+PiBuID4+IGs7CiAgICBkcFswXVswXSA9IDE7CiAgICBmWzBdWzBdID0gMTsKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG1pbihuLCBCIC0gNSk7IGkrKykgewogICAgICAgIGZvciAoaW50IGogPSAxOyBqIDw9IGs7IGorKykgewogICAgICAgICAgICBpZiAoaiA+PSBpKSBhZGQoZHBbaV1bal0sIChkcFtpXVtqIC0gaV0gKyBkcFtpIC0gMV1baiAtIGldKSAlIG1vZCk7CiAgICAgICAgICAgIGlmIChqID49IG4gKyAxKSBkcFtpXVtqXSA9IChkcFtpXVtqXSAtIGRwW2kgLSAxXVtqIC0gbiAtIDFdICsgbW9kKSAlIG1vZDsKICAgICAgICAgICAgYWRkKGZbaSAmIDFdW2pdLCBkcFtpXVtqXSk7CiAgICAgICAgfQogICAgfQogICAgbGwgYW5zID0gMDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IGs7IGkrKykgewogICAgICAgIGFkZChhbnMsIEV1bGVyKGsgLSBpLCBuKSAqIChmWzBdW2ldIC0gZlsxXVtpXSArIG1vZCkgJSBtb2QpOwogICAgfQogICAgY291dCA8PCBhbnM7Cn0KLyoKZHVhIGJhaSB0b2FuIHZlIHRpbSBzbyBkYXkgYVtdIHNhbyBjaG8gYVtpXSA8IGkgdmEgdG9uZyBkYXkgPSBrCi0gdGEgZGVtIHNvIGRheSBiYW5nIGJhbyBoYW0gbG9haSB0cnUgOgptb3QgZGF5IGtob25nIHRob2EgbWFuIGtoaSB0b24gdGFpIGFbaV0gPj0gaQpuaHUgdmF5IG5ldSB0YSBuaGluIGR1b2kgZGFuZyBiaXRtYXNrIG4gcGhhbiB0dSB2b2kgcGhhbiB0dSBpIGJhdCA8PT4gYVtpXSA+PSBpIGJhaSB0b2FuIHNlIHRybyB2ZSBiYWkgZGVtIHNvIHNvIG5ndXllbiB0byBjdW5nIG5oYXUgdm9pIHgKeGV0IGRheSBnb20gbiBwaGFuIHR1IGFbaV0gPSBpLCBnb2kgZHBbaV1bal0gbGEgc28gY2FjaCBkZSB0YW8gcmEgdG9uZyBqIHR1IGkgcGhhbiB0dSB0cm9uZyBkYXkgYVtdLCBnb2kgZlswLzFdW2pdIGxhbiBsdW90IGxhIHNvIGNhY2ggdGFvIHJhIHRvbmcgaiB0dSBjaGFuIC8gbGUgcGhhbiB0dSB0cm9uZyBkYXkgYVtdCnR1IGRheSB0YSBjbyBjb25nIHRodWMgYW5zID0gdG9uZyAoY2hpYWtlbyhrIC0geCwgbikgKiAoZlswXVt4XSAtIGZbMV1beF0pIHZvaSBtb2kgMCA8PSB4IDw9IGspCioqIGNhY2ggdGluaCBtYW5nIGRwICoqCmNvbmcgdGh1YyA6IGRwW2ldW2pdID0gZHBbaV1baiAtIGldICsgZHBbaSAtIDFdW2ogLSBpXSAtIGRwW2kgLSAxXVtqIC0gKG4gKyAxKV07CmRwW2ldW2ogLSBpXSAtPiBkcFtpXVtqXSBsYSBkYXQgbW90IHRoYW5oIG5hbSBuZ2FuZyBkbyBkYWkgaSBkdW9pIGkgcGhhbiB0dSBkYW5nIGNvCmRwW2kgLSAxXVtqIC0gaV0gLT4gZHBbaV1bal0gbGEgZGF0IG1vdCB0aGFuaCBuYW0gbmdhbmcgZG8gZGFpIGkgKyAxIGR1b2kgaSBwaGFuIHR1IGRhbmcgY28gdmEgdGFvIHJhIHRoZW0gcGhhbiB0dSB0aHUgaSArIDEKLSBkcFtpIC0gMV1baiAtIChuICsgMSldIGxhIGRlIGxvYWkgZGkgY2FjIHRyYW5nIHRoYWkgbWEgc2F1IGtoaSBkYXQgY2FjIHRoYW5oIG5nYW5nIHRoaSB4dWF0IGhpZW4gcGhhbiB0dSBsb24gbmhhdCA9IChuICsgMSkgKGNhYyBwaGFuIHR1IG5heSBiaSBsb2FpIHZpIGRheSBhW10gY28gYVtpXSA9IGkpCiovCg==