import java.util.*;
public class Main {
static final int M = 1000000007;
static final int K = 5000; // K is an offset to account for negatives
public static void main
(String[] args
) { Scanner scanner
= new Scanner
(System.
in); int n = scanner.nextInt();
int x = scanner.nextInt();
int[] s = new int[n];
for (int i = 0; i < n; i++) {
s[i] = scanner.nextInt();
}
// the subarray we're currently at
long[][] dp1 = new long[n + 1][x + K + 1];
// the next subarray (we'll fill this up using dp1)
long[][] dp2 = new long[n + 1][x + K + 1];
dp1[0][K] = 1; // dp[0][0][0] -> 0 people, 0 unfinished groups, 0 penalty
for (int i = 0; i < n; i++) {
for (int j = 0; j <= (n - i); j++) { // at most n - i unfinished groups
for (int k = 0; k <= x + K; k++) {
if (dp1[j][k] == 0) continue;
dp2[j][k] += dp1[j][k]; // i has their own group
if (j > 0 && k + s[i] <= x + K) {
dp2[j - 1][k + s[i]] += j * dp1[j][k]; // finish group
}
if (j + 1 <= n - (i + 1)) {
dp2[j + 1][k - s[i]] += dp1[j][k]; // create new unfinished group
}
if (j <= n - (i + 1)) {
dp2[j][k] += j * dp1[j][k]; // extend unfinished group
}
}
}
for (int j = 0; j <= (n - (i + 1)); j++) {
for (int k = 0; k <= x + K; k++) {
dp1[j][k] = dp2[j][k] % M; // i + 1 becomes the new i
dp2[j][k] = 0;
}
}
}
int ans = 0;
for (int i = K; i <= x + K; i++) {
ans += dp1[0][i];
ans %= M;
}
}
}