// Constraints Assertion Only #include <bits/stdc++.h> #define ll long long int #define pb push_back #define mp make_pair #define mod 1000000007 #define vl vector <ll> #define all(c) (c).begin(),(c).end() using namespace std; ll power(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;} ll modInverse(ll a){return power(a,mod-2);} const int N=2000023; bool vis[N]; vector <int> adj[N]; long long readInt(long long l,long long r,char endd){ long long x=0; int cnt=0; int fi=-1; bool is_neg=false; while(true){ char g=getchar(); if(g=='-'){ assert(fi==-1); is_neg=true; continue; } if('0'<=g && g<='9'){ x*=10; x+=g-'0'; if(cnt==0){ fi=g-'0'; } cnt++; assert(fi!=0 || cnt==1); assert(fi!=0 || is_neg==false); assert(!(cnt>19 || ( cnt==19 && fi>1) )); } else if(g==endd){ if(is_neg){ x= -x; } if(!(l <= x && x <= r)) { cerr << l << ' ' << r << ' ' << x << '\n'; assert(1 == 0); } return x; } else { assert(false); } } } string readString(int l,int r,char endd){ string ret=""; int cnt=0; while(true){ char g=getchar(); assert(g!=-1); if(g==endd){ break; } cnt++; ret+=g; } assert(l<=cnt && cnt<=r); return ret; } long long readIntSp(long long l,long long r){ return readInt(l,r,' '); } long long readIntLn(long long l,long long r){ return readInt(l,r,'\n'); } string readStringLn(int l,int r){ return readString(l,r,'\n'); } string readStringSp(int l,int r){ return readString(l,r,' '); } ll fact[N]; ll invfact[N]; ll inv[N]; void factorialsComputation() { inv[0]=inv[1]=1; fact[0]=fact[1]=1; invfact[0]=invfact[1]=1; for(int i=2;i<N;i++) { inv[i]=(inv[mod%i]*(mod-mod/i))%mod; fact[i]=(fact[i-1]*i)%mod; invfact[i]=(invfact[i-1]*inv[i])%mod; } } ll ncr(ll n,ll r) { ll ans=fact[n]*invfact[r]; ans%=mod; ans*=invfact[n-r]; ans%=mod; return ans; } void solve() { int n,m,x,y; n=readInt(1,200000,' '); m=readInt(1,1000000,' '); x=readInt(0,1000000,' '); y=readInt(0,1000000,'\n'); int A[n+1]={0}; map <pair<int,int>,int> mark; int maxX=0,maxY=0; for(int i=1;i<=n;i++) { if(i==n) A[i]=readInt(1,1000000,'\n'); else A[i]=readInt(1,1000000,' '); mark[mp(A[i]/m,A[i]%m)]=1; maxX=max(maxX,A[i]/m); maxY=max(maxY,A[i]%m); } int dp[maxX+10][maxY+10]; memset(dp,0,sizeof(dp)); // reach (maxX+1,maxY+1) dp[0][0]=1; for(int i=0;i<=maxX+1;i++) { for(int j=0;j<=maxY+1;j++) { if(i==0 && j==0) continue; if(mark[mp(i,j)]==1) { dp[i][j]=0; continue; } if(j>=1) dp[i][j]+=dp[i][j-1]; if(i>=1) dp[i][j]+=dp[i-1][j]; dp[i][j]%=mod; } } if(x<=maxX+1 && y<=maxY+1) { cout<<dp[x][y]<<'\n'; return; } ll ans=0; for(int j=0;j<=maxY+1;j++) { int reqX=x-maxX-2; int reqY=y-j; if(min(reqX,reqY)<0) continue; ans+=(dp[maxX+1][j]*ncr(reqX+reqY,reqX)); ans%=mod; } for(int i=0;i<=maxX+1;i++) { int reqX=x-i; int reqY=y-maxY-2; if(min(reqX,reqY)<0) continue; ans+=(dp[i][maxY+1]*ncr(reqX+reqY,reqX)); ans%=mod; } cout<<ans<<'\n'; } int main() { #ifndef ONLINE_JUDGE freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); #endif ios_base::sync_with_stdio(false); cin.tie(NULL),cout.tie(NULL); int T=1; factorialsComputation(); while(T--) solve(); assert(getchar()==-1); cerr << "Time : " << 1000 * ((double)clock()) / (double)CLOCKS_PER_SEC << "ms\n"; }