#include using namespace std; #define MOD 1000000007 int main(){ cin.tie(nullptr); ios::sync_with_stdio(false); int N, MP, Mq, L; cin >> N >> MP >> Mq >> L; vector S(N); for (int i = 0; i < N; i++){ cin >> S[i]; } vector> dp(MP + 1, vector(Mq + 1, 0)); for (int x = 0; x <= MP; x++){ dp[x][0] = 1; } for (int y = 1; y <= min(S[0], Mq); y++){ for (int x = 0; x <= MP; x++){ if (x + y < L) continue; dp[x][y] = 1; } } for (int i = 1; i < N; i++){ vector> q0(MP + 1, vector(Mq + 1, 0)); // 0個のq vector> q1(MP + 1, vector(Mq + 1, 0)); // 1個以上のq for (int y = 0; y <= Mq; y++){ for (int x = 0; x <= MP; x++){ q0[x][y] = dp[x][y]; int X = min(x + L - 1, MP); int Y = x + y + L - X; if (y < Y && Y <= min(y + S[i], Mq)){ q1[X][Y] = (q1[X][Y] + dp[x][y]) % MOD; Y = min(Mq, y + S[i]) + 1; X = x + y + L - Y; if (0 <= X && X <= MP && 0 <= Y && Y <= Mq){ q1[X][Y] = (q1[X][Y] - dp[x][y] + MOD) % MOD; } } } } for (int y = 1; y <= Mq; y++){ for (int x = 0; x < MP; x++){ q1[x][y] = (q1[x][y] + q1[x + 1][y - 1]) % MOD; } } for (int y = 0; y <= Mq; y++){ for (int x = 0; x <= MP; x++){ if (x > 0){ q1[x][y] = (q1[x][y] + q1[x - 1][y]) % MOD; q0[x][y] = (q0[x][y] + q0[x - 1][y]) % MOD; } dp[x][y] = (q1[x][y] + q0[x][y]) % MOD; } } } long ans = 0; for (int y = 0; y <= Mq; y++){ ans = (ans + dp[MP][y]) % MOD; } cout << ans << endl; }