#define y1 askjdkasldjlkasd
#include <bits/stdc++.h>
#undef y1

using namespace std;

#define pb push_back
#define mp make_pair
#define fi(a, b) for(int i=a; i<=b; i++)
#define fj(a, b) for(int j=a; j<=b; j++)
#define fo(a, b) for(int o=a; o<=b; o++)
#define fdi(a, b) for(int i=a; i>=b; i--)
#define fdj(a, b) for(int j=a; j>=b; j--)
#define fdo(a, b) for(int o=a; o>=b; o--)
#define sz(x) (int)x.size()

typedef long long ll;
typedef long double ld;
typedef vector<int> vi;
typedef pair<int, int> pii;
typedef vector<pii> vpii;
typedef vector<ll> vl;
typedef pair<ll, ll> pll;
typedef vector<pll> vpll;
typedef vector<ll> vll;

#ifdef LOCAL
#define err(...) fprintf(stderr, __VA_ARGS__)
#else
#define err(...) while (0)
#endif

double START_TIME;

void exit() {
#ifdef LOCAL	
	cerr << "TIME: " << setprecision(5) << fixed << (clock() - START_TIME) / CLOCKS_PER_SEC << endl;
#endif	
	exit(0);
}

template<typename A, typename B>
ostream& operator<<(ostream& os, pair<A, B> p) {
	os << "(" << p.first << ", " << p.second << ")";
	return os;
}

template<typename T>
ostream& operator<<(ostream& os, vector<T> v) {
	fi(0, sz(v) - 1) {
		os << v[i] << " ";
	}
	return os;
}

template<typename T>
ostream& operator<<(ostream& os, set<T> t) {
	for (auto z : t) {
		os << z << " ";
	}
	return os;
}

template<typename T1, typename T2>
ostream& operator<<(ostream& os, map<T1, T2> t) {
	cerr << endl;
	for (auto z : t) {
		os << "\t" << z.first << " -> " << z.second << endl;
	}
	return os;
}

#ifdef LOCAL
#define dbg(x) {cerr << __LINE__ << "\t" << #x << ": " << x << endl;}
#define dbg0(x, n) {cerr << __LINE__ << "\t" << #x << ": "; for (int ABC = 0; ABC < n; ABC++) cerr << x[ABC] << ' '; cerr << endl;}
#else
#define dbg(x) while(0){}
#define dbg0(x, n) while(0){}
#endif

#ifdef LOCAL
#define ass(x) if (!(x)) { cerr << __LINE__ << "\tassertion failed: " << #x << endl, abort(); }
#else
#define ass(x) assert(x)
#endif

///////////////////////////////////////////////////

const int MAX = 1e5 + 41;
const int MOD = 1e9 + 7;

int add(int a, int b) {
	a += b;
	if (a >= MOD) a -= MOD;
	return a;
}

int mul(int a, int b) {
	return (ll) a * b % MOD;
}

int bp(int x, int d) {
	int res = 1;
	while (d) {
		if (d & 1) res = mul(res, x);
		x = mul(x, x);
		d >>= 1;
	}
	return res;
}

int inv(int x) {
	return bp(x, MOD - 2);
}


int f[MAX];
int invf[MAX];

void init() {
	f[0] = 1;
	fi(1, MAX - 1) f[i] = mul(f[i - 1], i);
	fi(0, MAX - 1) invf[i] = inv(f[i]);
}

int d[18][MAX];
int n;
int x;
int a[MAX];


int getc(int n, int k) {
	if (n == k) return 1;
	if (n < k) return 0;
	return mul(f[n], mul(invf[k], invf[n - k]));
}

int pref[MAX];

int getsum(int l, int r) {
	if (l > r) return 0;
	int res = pref[r];
	if (l) res -= pref[l - 1];
	return res;
}

void solve () {	
	fi(0, n - 1) {
		pref[a[i]]++;		
	}
	fi(1, MAX - 1) pref[i] += pref[i - 1];
	{
		int q = getsum(x + 1, MAX - 1);		
		int v1 = f[q];
		int v2 = getc(n, q);
		int v = mul(v1, v2);
		d[0][x] = v;
		dbg(v);
		dbg(v1);
		dbg(v2);
	}
	fo(0, 16) {
		fj(0, MAX - 1) {
			if (!d[o][j]) continue;
			bool f = false;
			fi(0, n - 1) {
				if (j >= a[i]) {
					f = true;
					int nj = j % a[i];
					int all = getsum(0, j);
					int bet = getsum(nj + 1, j) - 1;
					int v1 = d[o][j];
					int v2 = getc(all - 1, bet);
					int v3 = ::f[bet];
					int v = mul(v1, mul(v2, v3));
					d[o + 1][nj] = add(d[o + 1][nj], v);
//					err("o = %d j = %d a = %d v1 = %d v2 = %d v3 = %d\n", o, j, a[i], v1, v2, v3);
				}
			}
			if (!f) {
				d[o + 1][j] = add(d[o + 1][j], d[o][j]);
			}
		}
	}
	int ans = 0;
	fi(0, MAX - 1) {
		if (!d[17][i]) continue;
//		err("i = %d w = %d\n", i, d[17][i]);
		ans = add(ans, mul(d[17][i], i));
	}
	printf("%d\n", ans);
}

int main() {
#ifdef LOCAL
	freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);
	START_TIME = (double)clock();
#endif

	init();		
	scanf("%d %d", &n, &x);
	fi(0, n - 1) scanf("%d", &a[i]);
	solve();

	exit();
	return 0;
}





Measured memory_bytes: 7552