//~ while (clock()<=69*CLOCKS_PER_SEC)
//~ #pragma comment(linker, "/stack:200000000")
//~ #pragma GCC optimize("O3")
//~ #pragma GCC optimize("Ofast")
//~ #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
//~ #pragma GCC optimize("unroll-loops")
#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

#define pb push_back
#define SZ(x) ((int)(x).size())
#define ALL(x) x.begin(),x.end()
#define all(x) x.begin(),x.end()
#define fi first
#define se second
#define _upgrade ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define erase_duplicates(x) sort(all(x)); (x).resize(distance((x).begin(), unique(all(x))));


using namespace std;
using namespace __gnu_pbds;
template<typename T>
using ordered_set = tree<
T,
null_type,
less<T>,
rb_tree_tag,
tree_order_statistics_node_update>;

//X.find_by_order(k); - zwraca iterator na k-ty element (numeracja od zerowego)
//X.order_of_key(k); - zwraca liczbę elementów ostro mniejszych niż k

typedef long long LL;
typedef pair<int,int> PII;
typedef pair<LL,LL> PLL;
typedef vector<PII> VPII;
typedef vector<PLL> VPLL;
typedef vector<LL> VLL;
typedef vector<int> VI;
typedef vector<string> VS;
typedef vector<char> VC;
typedef long double LD;
typedef pair<LD,LD> PLD;
typedef vector<LD> VLD;
typedef vector<PLD> VPLD;

template<class TH> void _dbg(const char *sdbg, TH h){ cerr<<sdbg<<" = "<<h<<endl; }
template<class TH, class... TA> void _dbg(const char *sdbg, TH h, TA... a) {
  while(*sdbg!=',')cerr<<*sdbg++;
  cerr<<" = "<<h<<", "; _dbg(sdbg+1, a...);
}

#ifdef LOCAL
#define dbg(...) _dbg(#__VA_ARGS__, __VA_ARGS__)
#else
#define dbg(...)
#define cerr if(0)cout
#endif

const int maxn = (1e5)+7;
const int maxk = 20;
const int inf = (1e9)+7;
const LL LLinf = ((LL)1e18)+7LL;
const LD eps = 1e-9;
const LL mod = 1e9+7;

// ***************************** CODE ***************************** //

LL dp[maxn];
LL sil[maxn];
LL odw[maxn];
LL ile[maxn];
LL tab[maxn];

LL pot(LL a, LL w)
{
  if(w == 0) return 1;
  LL b = pot(a, w / 2);
  b = b * b % mod;
  if(w & 1) return a * b % mod;
  return b;
}

LL net(LL n, LL k)
{
  if(n < 0 || n < k || k < 0) return 0;
  return sil[n] * odw[k] % mod * odw[n - k] % mod;
}

LL przejscie(LL x, LL y)
{
  LL a = ile[x];
  LL b = a - ile[y];
//  cerr<<x<<" "<<y<<" "<<net(a - 1, b - 1)<<endl;
  return net(a - 1, b - 1) * sil[b - 1] % mod;
}

int main()
{
	_upgrade
  odw[0] = sil[0] = 1;
  for(int i = 1;i < maxn;i++)
  {
    sil[i] = (sil[i - 1] * (LL)i) % mod;
    odw[i] = pot(sil[i], mod - 2);
  }
  LL n, x;
  cin>>n>>x;
  for(int i = 1;i <= n;i++)
  {
    cin>>tab[i];
    ile[tab[i]]++;
  }
  sort(tab + 1, tab + n + 1);
  for(int i = 1;i < maxn;i++)
    ile[i] += ile[i - 1];
  ile[maxn - 2]++;
  dp[x] = przejscie(maxn - 2, x);
//  cerr<<dp[x]<<endl;
  for(int i = x ;i >= 0;i--)
  {
  //  cerr<<i<<" "<<dp[i]<<endl;
    for(int j = 1;j <= n;j++)
      if(tab[j] <= i)
      {
        //cerr<<x<<" - "<<dp[x] * przejscie(x, x % tab[j])<<endl;
        dp[i % tab[j]] = (dp[i % tab[j]] + przejscie(i, i % tab[j]) * dp[i]) % mod;
      }
  }
  LL res = 0LL;
  for(int i = 0;i < tab[1];i++)
  {
    res += dp[i] * (LL) i;
    res %= mod;
  }
  res = ((res % mod) + mod) % mod;
  cout<<res;

	return 0;
}


Measured memory_bytes: 2944