#include<map>
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
int read()
{
int res=0,ch,flag=0;
if((ch=getchar())=='-') //判断正负
flag=1;
else if(ch>='0'&&ch<='9') //得到完整的数
res=ch-'0';
while((ch=getchar())>='0'&&ch<='9')
res=res*10+ch-'0';
return flag?-res:res;
}
const ll mod = 1e9+7;
const int N = 5000+10;
int n, m;
ll dp[N][N];
ll sum2[N];
ll sum1[N];
void solve()
{
int s=read(),b=read();
b-=s;
//底部长度为i
//dp[i,j]=dp[i,j-i]+2*dp[i-1,j-(i-1)]+3*dp[i-2,j-(i-2)]+...+
//
for(int i=1; i<=s; ++i)
for(int j=0; j<=b; ++j)
{
//剩下的
sum2[j]=(sum2[j]+sum1[j])%mod;
//底部为i,还有j
if(j==0)
dp[i][j]=1;
else
//底部是i,剩余j块儿
//也就是 除了底部的话,剩下的块是j
//那么也就是说 往上的j块儿,随便放,只要符合条件就行
dp[i][j]=sum2[j];
//总数是i+j
//这里累加到总的方案数里的i 都是 小于s的,
//在i=i+1时,当前加到里面的所有的方案的i 都是小于 此时的i的,那么也就成立了
sum1[j+i]=(dp[i][j]+sum1[j+i])%mod;
}
cout<<dp[s][b]<<endl;
}
int main()
{
int t=1;
while(t--)
solve();
return 0;
}