#include <bits//stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
typedef tree<long long, null_type, less<long long>, rb_tree_tag,
tree_order_statistics_node_update>
ordered_set;
typedef tree<long long, null_type, less_equal<long long>, rb_tree_tag,
tree_order_statistics_node_update>
ordered_multiset;
#define ll long long
#define iloop(m, h) for (auto i = m; i != h; i += (m < h ? 1 : -1))
#define jloop(m, h) for (auto j = m; j != h; j += (m < h ? 1 : -1))
#define kloop(m, h) for (auto k = m; k != h; k += (m < h ? 1 : -1))
#define lloop(m, h) for (auto l = m; l != h; l += (m < h ? 1 : -1))
#define pll pair<ll, ll>
#define INF 1000000000000000
#define MOD1 1000000007
#define MOD2 998244353
#define MOD3 1000000009
ll n, m, a[105], d[105], dp[105][105][1005][3];
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> n >> m;
iloop(0, n) cin >> a[i];
sort(a, a+n);
iloop(0, n-1) d[i] = a[i+1] - a[i];
d[n-1] = 0;
memset(dp, 0, sizeof(dp));
dp[0][0][0][0] = 1;
iloop(0, n) jloop(1, n+1) kloop(0, m+1) {
if (k >= (2*j)*d[i]) {
dp[i+1][j][k][0] += dp[i][j+1][k-(2*j)*d[i]][0]*j;
dp[i+1][j][k][0] += dp[i][j][k-(2*j)*d[i]][0]*2*j;
dp[i+1][j][k][0] += dp[i][j-1][k-(2*j)*d[i]][0]*j;
}
if (k >= (2*j-1)*d[i]) {
dp[i+1][j][k][1] += dp[i][j+1][k-(2*j-1)*d[i]][1]*j;
dp[i+1][j][k][1] += dp[i][j][k-(2*j-1)*d[i]][1]*(2*j-1);
dp[i+1][j][k][1] += dp[i][j-1][k-(2*j-1)*d[i]][1]*(j-1);
dp[i+1][j][k][1] += dp[i][j][k-(2*j-1)*d[i]][0]*2;
dp[i+1][j][k][1] += dp[i][j-1][k-(2*j-1)*d[i]][0]*2;
}
if (k >= (2*j-2)*d[i]) {
dp[i+1][j][k][2] += dp[i][j+1][k-(2*j-2)*d[i]][2]*j;
dp[i+1][j][k][2] += dp[i][j][k-(2*j-2)*d[i]][2]*(2*j-2);
dp[i+1][j][k][2] += dp[i][j-1][k-(2*j-2)*d[i]][2]*(j-2);
if (i) {
dp[i+1][j][k][2] += dp[i][j][k-(2*j-2)*d[i]][1];
dp[i+1][j][k][2] += dp[i][j-1][k-(2*j-2)*d[i]][1];
}
else {
dp[i+1][j][k][2] += dp[i][j-1][k-(2*j-2)*d[i]][0];
}
}
lloop(0, 3) {
dp[i+1][j][k][l] %= MOD1;
//cout << i+1 << " " << j << " " << k << " " << l << ":" << dp[i+1][j][k][l] << "\n";
}
}
ll cs = 0;
iloop(0, m+1) {cs += dp[n][1][i][2]; cs %= MOD1;}
cout << cs;
}