#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

using namespace std;
using namespace __gnu_pbds;
 
#define fi first
#define se second
#define mp make_pair
#define pb push_back
 
typedef long long ll;
typedef pair<int,int> ii;
typedef vector<int> vi;
typedef unsigned long long ull;
typedef long double ld; 
typedef tree<ii, null_type, less<ii>, rb_tree_tag, tree_order_statistics_node_update> pbds;

vector<int> fact;
vector<int> ifact;
vector<int> inv;
vector<int> pow2;
const int MOD = (1e9 + 7);
int add(int a, int b)
{
	a+=b;
	while(a>=MOD) a-=MOD;
	return a;
}
int mult(int a, int b)
{
	return (a*1LL*b)%MOD;
}
int modpow(int a, int b)
{
	int r=1;
	while(b)
	{
		if(b&1) r=mult(r,a);
		a=mult(a,a);
		b>>=1;
	}
	return r;
}
int choose(int a, int b)
{
	if(a<0) return 0;
	if(a<b) return 0;
	if(b==0) return 1;
	if(a==b) return 1;
	return mult(fact[a],mult(ifact[b],ifact[a-b]));
}
int inverse(int a)
{
	return modpow(a,MOD-2);
}
void init(int _n)
{
	fact.clear(); ifact.clear(); inv.clear(); pow2.clear();
	fact.resize(_n+1);
	ifact.resize(_n+1);
	inv.resize(_n+1);
	pow2.resize(_n+1);
	pow2[0]=1;
	ifact[0]=1;
	fact[0]=1;
	for(int i=1;i<=_n;i++)
	{
		pow2[i]=add(pow2[i-1],pow2[i-1]);
		fact[i]=mult(fact[i-1],i);
		//ifact[i]=mult(ifact[i-1],inv[i]);
	}
	ifact[_n] = inverse(fact[_n]);
	for(int i=_n-1;i>=1;i--)
	{
		ifact[i] = mult(ifact[i + 1], i + 1);
	}
	for(int i=1;i<=_n;i++)
	{
		inv[i] = mult(fact[i-1],ifact[i]);
	}
}

int f(int i, int m, int k)
{
	if(k<=0) return 0;
	int ans = choose(i+m-1,m-1);
	int sign=-1;
	for(int j=1;j*1LL*k<=i;j++)
	{
		if(sign==1) ans=add(ans,mult(choose(i-j*k+m-1,m-1),choose(m,j)));
		else ans=add(ans,MOD-mult(choose(i-j*k+m-1,m-1),choose(m,j)));
		sign*=-1;
	}
	return ans;
}

int solve(int n, int m, int s)
{
	if(s<0) return 0;
	int ans=0;
	for(int k=0;k<=s;k++)
	{
		ll rems = s-(n-m)*1LL*(k+1);
		if(rems<0) break;

		/*
		int coeff = choose(rems+n-m,n-m);
		//cerr<<rems<<' '<<n-m<<'\n';
		int coeff2 = add(f(i,m,k+1),MOD-f(i,m,k));
		//cerr<<k<<' '<<i<<' '<<coeff<<' '<<coeff2<<'\n';
		ans=add(ans,mult(coeff,coeff2));
		*/
		//ans = add(ans,choose(rems+n,n));
		int res=0;
		{
			int sign=-1;
			for(int j=1;j*1LL*(k+1)<=rems&&j<=m;j++)
			{
				if(sign==1) res=add(res,mult(choose(rems-j*(k+1)+n,n),choose(m,j)));
				else res=add(res,MOD-mult(choose(rems-j*(k+1)+n,n),choose(m,j)));
				sign*=-1;
			}
		}
		{
			int sign=1;
			for(int j=1;j*1LL*k<=rems&&j<=m;j++)
			{
				if(sign==1) res=add(res,mult(choose(rems-j*k+n,n),choose(m,j)));
				else res=add(res,MOD-mult(choose(rems-j*k+n,n),choose(m,j)));
				sign*=-1;
			}
		}
		ans=add(ans,res);
		
	}
	//cerr<<n<<' '<<m<<' '<<s<<' '<<ans<<'\n';
	ans=mult(ans,choose(n,m));
	//cerr<<choose(s+n,n)<<' '<<ans<<'\n';
	ans=add(choose(s+n,n),MOD-ans);
	//cerr<<ans<<'\n';
	return ans;
}

int main()
{
	ios_base::sync_with_stdio(0); cin.tie(0);
	init(1288888);
	/*
	int C,D; cin>>C>>D;
	cerr<<f(C,5,D)<<endl;
	int cnt=0;
	for(int a=0;a<D;a++)
	{
		for(int b=0;b<D;b++)
		{
			for(int d=0;d<D;d++)
			{
				for(int e=0;e<D;e++)
				{
					int c=C-a-b-d-e;
					if(c>=0&&c<D) cnt++;
				}
			}
		}
	}
	cerr<<cnt<<endl;
	*/
	int n,m,l,r; cin>>n>>m>>l>>r; m=n-m;
	cout<<add(solve(n,m,r),MOD-solve(n,m,l-1))<<'\n';
}


Measured memory_bytes: 20352