#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==