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