#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<stdio.h>
#include<vector>
#include<set>
using namespace std;
const int mod=1e9+7; 
typedef long long LL; 
int power(int a,int n)
{
	if(n==0)
	   return 1;
	int ret=power(a,n/2);
	ret=1LL*ret*ret%mod;
	if(n%2)
	   ret=1LL*ret*a%mod;
	return ret;
}

#define inf 0x3f3f3f3f
#define mem(a,b) memset(a,b,sizeof(a))
#define REP(i,a,b) for(int i=a; i<=b; ++i)
#define PER(i,a,b) for(int i=a; i>=b; --i)
#define MP make_pair
#define PB push_back
#define fi first
#define se second
typedef pair<int,int> pii;
int ex[1101],fac[1101],f[2101],inv[1101];
const double PI = acos(-1.0);
const int Bin = 11;
const int P=1e9+7;
const int maxn = (1<<Bin);
const int md=1e9+7;
const int mmd =(1<<15);
vector<int> vec[12];
struct Comp {
    double re, im;
    Comp(): re(0), im(0) {}
    Comp(const double _re, const double _im) { re = _re; im = _im; }
    Comp operator+(const Comp &a) { return Comp(re+a.re, im+a.im); }
    Comp operator-(const Comp &a) { return Comp(re-a.re, im-a.im); }
    Comp operator*(const Comp &a) { return Comp(re*a.re-im*a.im, re*a.im+im*a.re); }
    Comp operator*(const double &a) { return Comp(re*a, im*a); }
    Comp operator/(const double &a) { return Comp(re/a, im/a); }
    void operator*=(const Comp &a) { (*this) = (*this) * a; }
    void operator+=(const Comp &a) { re += a.re; im += a.im; }
    void operator*=(const double &a) { re*=a; im*=a; }
    void operator/=(const double &a) { re/=a; im/=a; }
    Comp conj() { return Comp(re, -im); }
};

vector<Comp> ww[Bin + 2];
void Init() {
    for(int i = 1, l = 2; l <= maxn; ++i, l <<= 1) {
       for(int k = 0; k < l/2; ++k)
	    	ww[i].push_back(Comp(cos(2*PI*k/l),sin(2*PI*k/l)));
    }
}

void FFT(Comp *a, int len, int type) {
    int i, j, k, l, tt;
    for(i = 1, j = len>>1; i < len-1; ++i) {
        if(i < j) swap(a[i], a[j]);
        k = len>>1;
        while(j >= k) j -= k, k >>= 1;
        j += k;
    }
    Comp var, u, v;
    for(l = 2, tt = 1; l <= len; l <<= 1, ++tt) {
        for(k = 0; k < len; k += l) {
            for(i = k; i < k+l/2; ++i) {
                var = ww[tt][i-k];
                if(type == -1) var.im = -var.im;
                u = a[i], v = var * a[i+l/2];
                a[i] = u+v, a[i+l/2] = u-v;
            }
        }
    }
    if(type == -1) for(i = 0; i < len; ++i) a[i] /= len;
}
Comp A[maxn + 5], B[maxn + 5], C[maxn + 5], DD[maxn + 5];
int aa[maxn*2],bb[maxn*2],cc[maxn*2],dd[maxn*2];
void Conv(int *a, int *b, int *c, int len) {
    for(int i = 0; i < len; ++i) {
        A[i] = Comp(a[i]>>15, b[i]>>15);
        B[i] = Comp(a[i]&(mmd-1), b[i]&(mmd-1));
    }
    FFT(A, len, 1); FFT(B, len, 1);
    for(int i = 0; i < len; ++i) {
        int j = (len-i) & (len-1);
        C[i] = (A[i]*A[i] - (A[j]*A[j]).conj()) * Comp(0, -0.25)+(A[i]*B[i] - (A[j]*B[j]).conj()) * Comp(0.5, 0);
        DD[i] = (B[i]*B[i] - (B[j]*B[j]).conj()) * Comp(0, -0.25);
    }
    FFT(C, len, -1); FFT(DD, len, -1);
    for(int i = 0; i < len; ++i) {
           c[i] = (((LL(C[i].re+0.5) %mod)<<30)%mod  + ((LL(C[i].im+0.5)%mod ) <<15)%mod+ LL(DD[i].re+0.5))%mod ;
	}
}
inline int read(){
    int f=1,x=0;char ch=getchar();
    while (ch<'0'||ch>'9'){if (ch=='-')f=-1;ch=getchar();}
    while (ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
    return f*x;
}
 
inline int qpow(int x,int p){int ans=1;
    for(;p;p>>=1,x=1ll*x*x%P)if(p&1)ans=1ll*ans*x%P;
    return ans;
} 
int temp[maxn],a[maxn],b[maxn],c[maxn],d[maxn],tmp[maxn];
inline void GetInv(int *a,int *b,int n){
    if (n==1) return void(b[0]=qpow(a[0],P-2));
    GetInv(a,b,n>>1);
    for (int i=0;i<n;++i)tmp[i]=a[i],tmp[n+i]=0;
    int k;for (k=1;k<=n;k<<=1);
    for (int i=n;i<k;++i)b[i]=0;
    Conv(tmp,b,tmp,k);
    for(int i=n;i<k;i++)
      tmp[i]=0;
    Conv(tmp,b,tmp,k);
    for (int i=0;i<n;++i)b[i]=(2*b[i]%mod-tmp[i]+mod)%mod,b[n+i]=0;
}
inline void Getln(int *a,int *b,int *c,int n){
    for (int i=0;i<n;++i)b[i]=1ll*(i+1)*a[i+1]%P;
    GetInv(a,c,n);
    for (int i=0;i<n;++i)tmp[i]=c[i],tmp[n+i]=0;
    int k;for (k=1;k<=n;k<<=1);
    Conv(tmp,b,tmp,k);
    for (int i=1;i<=n;++i)b[i]=1ll*tmp[i-1]*qpow(i,P-2)%P,b[i+n]=0;b[0]=0;
}

inline void Getexp(int *a,int *b,int *c,int *d,int n){
    if (n==1)return void(b[0]=1);
    Getexp(a,b,c,d,n>>1);
    Getln(b,c,d,n);
    for (int i=0;i<n;++i)tmp[i]=(a[i]-c[i]+P)%P,tmp[n+i]=0;++tmp[0];
    int k;for (k=1;k<=n;k<<=1);
    Conv(tmp,b,tmp,k);
    for (int i=0;i<n;++i)b[i]=tmp[i],b[i+n]=0;
}
void got(int n,int deep)
{
	int i;
	if(n==1)
	{
	    vec[deep].push_back(1);
		vec[deep].push_back(1);
		return;
	}
	got(n>>1,deep+1);
	vec[deep].resize(n+1);
	int d=n>>1;
	for(i=0;i<=n;i++)
	{
		if(i==0)
		   ex[i]=1;
		else
		   ex[i]=1LL*ex[i-1]*d%mod; 
	}
	int len=1;
	while(len<=d+d)
	   len<<=1;
	for(i=0;i<len;i++)
	{
	    if(i<=(n>>1))
	    {
	       aa[i]=1LL*ex[(n>>1)-i]*inv[(n>>1)-i]%mod;
		   bb[i]=1LL*fac[i]*vec[deep+1][i]%mod;
		}
		else
		   bb[i]=aa[i]=0;	
	}
	Conv(aa,bb,cc,len);
	for(i=0;i<=d;i++)
		cc[i]=1LL*cc[i+(n>>1)]*inv[i]%mod;
	for(i=d+1;i<len;i++)
	    cc[i]=0;
	for(i=0;i<len;i++)
	{
		if(i<=(n>>1))
		   aa[i]=vec[deep+1][i];
		else
		   aa[i]=0;
	}
	Conv(aa,cc,bb,len);
	if(n&1)
	{
		for(i=0;i<=n;i++)
		{
			vec[deep][i]=1LL*bb[i]*n%mod;
			vec[deep][i]=(vec[deep][i]+bb[i-1])%mod;
		}
	}
	else
	{
		for(i=0;i<=n;i++)
		   vec[deep][i]=bb[i];
	}
}
int CC(int n,int m)
{
	return 1LL*fac[n]*inv[m]%mod*inv[n-m]%mod;
}
long long S,T;
int n,m;
int main()
{
	Init();
	scanf("%lld%lld%d%d",&S,&T,&n,&m);
	int i,j,s,p,q;
	for(i=0;i<=m-n+1;i++)
	{
		if(i==0)
		  fac[i]=1;
		else
		  fac[i]=1LL*fac[i-1]*i%mod;
	}
	inv[m-n+1]=power(fac[m-n+1],mod-2);
	for(i=m-n;i>=0;i--)
	   inv[i]=1LL*inv[i+1]*(i+1)%mod;
	int len=1;
	while(len<=m-n)
	   len<<=1;
    got(m-n,0);
    S=(S-(m-n)+mod)%mod;
    T%=mod;
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    for(i=1;i<=m-n;i++)
    	b[i]=inv[i+1];
	b[0]=1;
	GetInv(b,a,len);  
	for(i=0;i<=m-n+1;i++)
	{
		if(i==0)
		   ex[i]=1;
		else
		   ex[i]=1LL*ex[i-1]*(T+1)%mod;
	}
	for(i=0;i<=m-n;i++)
	{
	    b[i]=1LL*(ex[i+1]-1)*inv[i+1]%mod;
        if(b[i]<0)
           b[i]+=mod;
	}
	for(i=m-n+1;i<len<<1;i++)
		a[i]=b[i]=0;
	Conv(a,b,f,len<<1);
	for(i=0;i<=m-n;i++)
	{
		f[i]=1LL*f[i]*fac[i]%mod;
		if(f[i]<0)
		   f[i]+=mod;
	}
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	memset(c,0,sizeof(c));
	int x,y;
	for(i=0;i<=m-n;i++)
	{
		a[i]=1LL*f[i]*inv[i]%mod;
		if(i%2)
		   a[i]=(mod-a[i])%mod;
		if(i==0)
		{
			x=power(a[i],mod-2);
			y=power(a[i],n);
		}
		a[i]=1LL*a[i]*x%mod;
	}
	Getln(a,b,c,len);
	for(i=0;i<=m-n;i++)
	   b[i]=1LL*b[i]*n%mod;
	for(i=m-n+1;i<len;i++)
	   b[i]=0;
	memset(a,0,sizeof(a));
	memset(c,0,sizeof(c));
	memset(d,0,sizeof(d));
	Getexp(b,a,c,d,len);
	for(i=0;i<=m-n;i++)
	   a[i]=1LL*a[i]*y%mod;
	int awp=1;
	for(i=0;i<=m-n;i++)
	{
	    b[i]=1LL*awp*inv[i]%mod;
	    awp=1LL*awp*S%mod;
	}
	for(i=m-n+1;i<len<<1;i++)
	   a[i]=b[i]=0;
	Conv(a,b,c,len<<1);
	int ans=0;
	for(i=0;i<=m-n;i++)
		ans=(ans+1LL*c[i]*vec[0][i]%mod*fac[i])%mod;
	ans=1LL*ans*inv[m-n]%mod;
	printf("%d\n",ans);
	return 0;
}
