#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;
}