#include <bits/stdc++.h>
using namespace std;
long long pow(long long a, long long b, long long M) {
  long long t = 1;
  for (a %= M; b; b >>= 1) {
    if (b & 1) t = t * a % M;
    a = a * a % M;
  }
  return t;
}
inline int getc() {
  static const int N = 222;
  static char buf[N];
  static int n = 0, p = 0;
  if (p == n) p = 0, n = fread(buf, 1, N, stdin);
  if (p == n) exit(0);
  return buf[p++];
}
inline int R(int& first) {
  int f = 1, c = getc();
  first = 0;
  while (c <= 32) c = getc();
  if (c == '-') f = -1, c = getc();
  for (; '0' <= c && c <= '9'; c = getc()) first = first * 10 + c - '0';
  first *= f;
}
const int N = 205, K = 1005, M = 1e9 + 7;
int f[N][N][K], n, m, a[N];
int main() {
  cin >> n >> m;
  for (int i = 1; i <= int(n); i++) scanf("%d", &a[i]);
  sort(a + 1, a + n + 1);
  f[0][0][0] = 1;
  for (int i = 0; i <= int(n - 1); i++) {
    for (int j = 0; j <= int(n); j++) {
      for (int k = 0; k <= int(m); k++)
        if (f[i][j][k]) {
          int d = j * (a[i + 1] - a[i]);
          if (k + d > m) continue;
          (f[i + 1][j][k + d] += 1LL * f[i][j][k] * (j + 1) % M) %= M;
          (f[i + 1][j + 1][k + d] += f[i][j][k]) %= M;
          if (j > 0) (f[i + 1][j - 1][k + d] += 1LL * f[i][j][k] * j % M) %= M;
        }
    }
  }
  int ans = 0;
  for (int i = 0; i <= int(m); i++) (ans += f[n][0][i]) %= M;
  cout << ans << endl;
}
