#include <bits/stdc++.h>
#define ll long long int
#define ld long double
using namespace std;
const ll mod = 1e9 + 7;
const ll M = 2e6 + 20;
vector<ll> fact(M, 1);
vector<vector<ll>> box, f;
ll power(ll x, ll n)
{
ll ans = 1;
while (n != 0)
{
if (n % 2 == 1)
ans = (ans * x) % mod;
x = (x * x) % mod;
n /= 2;
}
return ans % mod;
}
ll nCr(ll n, ll r)
{
if (r < 0 || r > n)
return 0;
ll x = power(fact[r], mod - 2);
ll y = power(fact[n - r], mod - 2);
x = (x * y) % mod;
return (fact[n] * x) % mod;
}
void mainSolve()
{
for (ll i = 2; i < M; i++)
fact[i] = (fact[i - 1] * i) % mod;
ll n, m, x, y, w, h;
cin >> n >> m >> x >> y;
vector<ll> v(n);
for (int i = 0; i < n; i++)
cin >> v[i];
w = 0;
h = 0;
for (int i = 0; i < n; i++)
{
w = max(w, v[i] / m);
h = max(h, v[i] % m);
}
box.assign(w + 1, vector<ll>(h + 1, 0));
for (int i = 0; i < n; i++)
box[v[i] / m][v[i] % m] = 1;
ll invalid = 0;
f.assign(w + 1, vector<ll>(h + 1, 0));
f[0][0] = 1;
for (int i = 0; i <= w; i++)
{
for (int j = 0; j <= h; j++)
{
if (i != 0)
f[i][j] = (f[i][j] + f[i - 1][j]) % mod;
if (j != 0)
f[i][j] = (f[i][j] + f[i][j - 1]) % mod;
if (box[i][j] == 1)
{
ll curr = (f[i][j] * nCr(x - i + y - j, x - i)) % mod;
invalid = (invalid + curr) % mod;
f[i][j] = 0;
}
}
}
ll ans = (nCr(x + y, x) - invalid + mod) % mod;
cout << ans << endl;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
int t;
t = 1;
while (t--)
{
mainSolve();
}
return 0;
}