#include <bits/stdc++.h>
using namespace std;
template <class X, class Y>
void minimize(X &x, const Y &y) {
  if (x > y) x = y;
}
template <class X, class Y>
void maximize(X &x, const Y &y) {
  if (x < y) x = y;
}
const int mod = (int)1e9 + 7;
int a[227], sum[227], n, allow;
int f[227][227][1111];
void init(void) {
  scanf("%d%d", &n, &allow);
  for (int i = (1), _b = (n); i <= _b; i = i + 1) scanf("%d", &a[i]);
  sort(a + 1, a + n + 1);
  for (int i = (1), _b = (n); i <= _b; i = i + 1) sum[i] = sum[i - 1] + a[i];
}
void update(int pos, int num, int curVal, int toUpdate) {
  if (pos + num > n) return;
  int tmp = curVal + sum[pos + num] - sum[pos];
  if (tmp < 0 || tmp > allow) return;
  f[pos][num][tmp] += toUpdate;
  if (f[pos][num][tmp] >= mod) f[pos][num][tmp] -= mod;
}
void optimize(void) {
  f[0][0][0] = 1;
  for (int pos = 0, _n = (n); pos < _n; pos = pos + 1)
    for (int num = 0, _n = (n + 1); num < _n; num = num + 1)
      for (int tmp = 0, _n = (allow + 1); tmp < _n; tmp = tmp + 1)
        if (pos + num <= n && f[pos][num][tmp] > 0) {
          int curVal = tmp - (sum[pos + num] - sum[pos]);
          if (num > 0)
            update(pos + 1, num, curVal, 1LL * f[pos][num][tmp] * num % mod);
          update(pos + 1, num, curVal, f[pos][num][tmp]);
          update(pos + 1, num + 1, curVal - a[pos + 1], f[pos][num][tmp]);
          if (num > 0)
            update(pos + 1, num - 1, curVal + a[pos + 1],
                   1LL * f[pos][num][tmp] * num % mod);
        }
  int res = 0;
  for (int i = 0, _n = (allow + 1); i < _n; i = i + 1)
    res = (res + f[n][0][i]) % mod;
  printf("%d\n", res);
}
int main(void) {
  init();
  optimize();
  return 0;
}
