#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
const ll INF = (ll)1e18;
const int X[] = {1, 0, -1, 0}, Y[] = {0, -1, 0, 1};
const int MOD = (ll)1e9 + 7;
int csb(int x) { return __builtin_popcount(x); }
int ctz(int x) { return __builtin_ctz(x); }
bool isSet(int x, int pos) { return (x & (1 << pos)) != 0; }
template <class T>
bool cmin(T &a, T b) {
  return a > b ? (a = b, true) : false;
}
template <class T>
bool cmax(T &a, T b) {
  return a < b ? (a = b, true) : false;
}
const int maxn = 210;
const int K = 1001;
int DP[maxn][maxn][K];
int scores[maxn];
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  cout.tie(nullptr);
  cout.precision(10);
  cout << fixed;
  int n, x;
  cin >> n >> x;
  for (int i = (int)(1); i < (int)(n + 1); i++) cin >> scores[i];
  sort(scores + 1, scores + n + 1);
  DP[1][0][0] = 1, DP[1][1][0] = 1;
  for (int i = (int)(1); i < (int)(n); i++)
    for (int open = 0; open < (int)(n + 1); open++)
      for (int cost = 0; cost < (int)(x + 1); cost++) {
        int new_cost = cost + (scores[i + 1] - scores[i]) * open;
        if (new_cost <= x) {
          (DP[i + 1][open][new_cost] += DP[i][open][cost]) %= MOD;
          (DP[i + 1][open][new_cost] += 1LL * open * DP[i][open][cost] % MOD) %=
              MOD;
          if (open)
            (DP[i + 1][open - 1][new_cost] +=
             1LL * open * DP[i][open][cost] % MOD) %= MOD;
          (DP[i + 1][open + 1][new_cost] += DP[i][open][cost]) %= MOD;
        }
      }
  ll answer = 0;
  for (int cost = 0; cost < (int)(x + 1); cost++)
    answer = (answer + DP[n][0][cost]) % MOD;
  cout << answer << '\n';
  return 0;
}
