#include #include using namespace std; using ll = long long; using ull = unsigned long long; #define rep(i,n) for(int i=0; i<(n); i++) const ll MOD = 1000000007; using mll = atcoder::static_modint<1000000007>; int N,P,Q,L; int S[40]; vector> dp; vector F,I,iF; mll C(int n,int r){ return F[n]*iF[r]*iF[n-r]; } void initC(int Z){ F.resize(Z+1); F[0]=1; for(int i=1; i<=Z; i++) F[i]=F[i-1]*i; I.resize(Z+1); I[1]=1; for(int i=2; i<=Z; i++) I[i]=-(MOD/i*I[MOD%i]); iF.resize(Z+1); iF[0]=1; for(int i=1; i<=Z; i++) iF[i]=iF[i-1]*I[i]; } int main(){ scanf("%d%d%d%d",&N,&P,&Q,&L); rep(i,N) scanf("%d",&S[i]); dp.assign(N+1,vector(P+1,0)); dp[0][0]=1; rep(i,N){ vector> buf = dp; rep(j,N+1) rep(q,Q) dp[j][q+1] += dp[j][q]; rep(j,N) for(int q=1; q<=Q; q++){ int l = max(0,q-S[i]); int r = q-1; if(l==0) buf[j+1][q] += dp[j][r]; else buf[j+1][q] += dp[j][r] - dp[j][l-1]; } dp = move(buf); } initC(40000); mll ans=0; for(int i=0; i<=N; i++){ if(i*L>P+Q) break; for(int q=0; q<=Q; q++){ int freeP = P - (i*L-q); if(freeP<0) continue; ans += dp[i][q] * C(freeP+N-1,N-1); } } printf("%u\n",ans.val()); return 0; }