#include <bits/stdc++.h>
#define int long long int
using namespace std;
template<typename T,typename U> using P=pair<T,U>;
template<typename T> using V=vector<T>;
template<typename T>bool chmax(T&a,T b){if(a<b){a=b;return true;}return false;}
template<typename T>bool chmin(T&a,T b){if(a>b){a=b;return true;}return false;}

template<typename T> vector<T> make_v(size_t a) { return vector<T>(a); }
template<typename T,typename... Ts> auto make_v(size_t a,Ts... ts) { return vector<decltype(make_v<T>(ts...))>(a,make_v<T>(ts...)); }

template<typename T> void fill_all(T& arr, const T& v) { arr = v; }
template<typename T, typename U> void fill_all(T& arr, const U& v) { for (auto& i : arr) fill_all(i, v); }

template<typename T>auto&operator<<(ostream&s,const vector<T>&v){s<<"[";bool a=1;for(auto e:v){s<<(a?"":" ")<<e;a=0;}s<<"]";return s;}
template<typename T,typename U>auto&operator<<(ostream&s,const pair<T,U>&p){s<<"("<<p.first<<","<<p.second<<")";return s;}
template<typename T>auto&operator<<(ostream&s,const set<T>&st){s<<"{";bool a=1;for(auto e:st){s<<(a?"":" ")<<e;a=0;}s<<"}";return s;}
template<typename T,typename U>auto&operator<<(ostream&s,const map<T,U>&m){s<<"{";bool a=1;for(auto e:m){s<<(a?"":" ")<<e.first<<":"<<e.second;a=0;}s<<"}";return s;}
#define DUMP(x) cout<<#x<<" = "<<(x)<<endl

struct edge { int to, cost; };

const int INF = 1LL<<60;
const int MOD = 1e9+7;


template<typename superType, class Operators>
struct Ring {

   superType x;

   template<typename... Args> Ring(Args... args) : x(args...) {}

   template<typename... Args>
      decltype(auto) operator[](Args... args) { return x.operator[](args...); }


   Ring& operator=(const Ring& value) & = default;

   template<typename... Args>
      static Ring id_add(Args... args) { return Operators::IdAdd(args...); }

   template<typename... Args>
      static Ring id_mul(Args... args) { return Operators::IdMul(args...); }

   Ring operator+() const { return *this; }
   Ring operator-() const { return Operators::Opposite(x); }

   Ring operator+=(const Ring& rhs) { x = Operators::Add(x, rhs.x); return *this; }
   Ring operator-=(const Ring& rhs) { *this += -rhs; return *this; }
   Ring operator*=(const Ring& rhs) { x = Operators::Mul(x, rhs.x); return *this; }

   const Ring operator+(const Ring& rhs) const { return Ring(*this) += rhs; }
   const Ring operator-(const Ring& rhs) const { return Ring(*this) -= rhs; }
   const Ring operator*(const Ring& rhs) const { return Ring(*this) *= rhs; }

   Ring power(int n) const { return Operators::Power(x, n); }

   bool operator<(const Ring& rhs) const { return Operators::Less(x, rhs.x); }
   bool operator>(const Ring& rhs) const { return rhs < *this; }
   bool operator<=(const Ring& rhs) const { return !(*this > rhs); }
   bool operator>=(const Ring& rhs) const { return !(*this < rhs); }
   bool operator==(const Ring& rhs) const { return !(*this < rhs) && !(*this > rhs); }
   bool operator!=(const Ring& rhs) const { return !(*this == rhs); }
};

template<typename superType, class Operators>
auto& operator<<(ostream& s,const Ring<superType, Operators>& a){ s << a.x; return s; }

template<typename superType, class Operators>
struct Field : Ring<superType, Operators> {

   using BaseRing = Ring<superType, Operators>;

   template<typename... Args> Field(Args... args) : BaseRing(args...) {}

   template<typename... Args>
      decltype(auto) operator[](Args... args) { return BaseRing::operator[](args...); }

   Field& operator=(const Field& value) & = default;

   template<typename... Args>
      static Field id_add(Args... args) { return BaseRing::id_add(args...); }

   template<typename... Args>
      static Field id_mul(Args... args) { return BaseRing::id_mul(args...); }

   Field operator+() const { return BaseRing::operator+(); }
   Field operator-() const { return BaseRing::operator-(); }
   Field reciprocal() const { return Operators::Reciprocal(this->x); }

   Field operator+=(const Field& rhs) { return *this = BaseRing::operator+=(rhs); }
   Field operator-=(const Field& rhs) { return *this = BaseRing::operator-=(rhs); }
   Field operator*=(const Field& rhs) { return *this = BaseRing::operator*=(rhs); }
   Field operator/=(const Field& rhs) { return *this *= rhs.reciprocal(); }

   const Field operator+(const Field& rhs) const { return Field(*this) += rhs; }
   const Field operator-(const Field& rhs) const { return Field(*this) -= rhs; }
   const Field operator*(const Field& rhs) const { return Field(*this) *= rhs; }
   const Field operator/(const Field& rhs) const { return Field(*this) /= rhs; }

   Field power(int n) const { return BaseRing::power(n); }

   bool operator<(const Field& rhs) const { return BaseRing::operator<(rhs); }
   bool operator>(const Field& rhs) const { return BaseRing::operator>(rhs); }
   bool operator<=(const Field& rhs) const { return BaseRing::operator<=(rhs); }
   bool operator>=(const Field& rhs) const { return BaseRing::operator>=(rhs); }
   bool operator==(const Field& rhs) const { return BaseRing::operator==(rhs); }
   bool operator!=(const Field& rhs) const { return BaseRing::operator!=(rhs); }

};

template<typename superType, class Operators>
auto& operator<<(ostream& s,const Field<superType, Operators>& a){ s << a.x; return s; }

template<int mod=MOD>
struct ModuloRingOperators {
   static int Add(int lhs, int rhs) { return (lhs + rhs) % mod; };
   static int Mul(int lhs, int rhs) { return (lhs * rhs) % mod; };
   static int IdAdd() { return 0; };
   static int IdMul() { return 1; };
   static int Opposite(int value) { return ((-value % mod) + mod) % mod; };
   static bool Less(int lhs, int rhs) { return lhs < rhs; };
   static int Power(int value, int n) {
      int res = IdMul();
      while (n > 0) {
         if (n & 1) res = Mul(res, value);
         value = Mul(value, value); n >>= 1;
      }
      return res;
   }
};

using MR = Ring<int, ModuloRingOperators<MOD>>;

template<int mod=MOD>
struct GaloisFieldOperators : ModuloRingOperators<mod> {
   static int Reciprocal(int value) { return ModuloRingOperators<mod>::Power(value, mod-2); }
};

using GF = Field<int, GaloisFieldOperators<MOD>>;



signed main()
{
   int n, x; cin >> n >> x;
   vector<int> s(n);
   for (int i = 0; i < n; ++i) {
      cin >> s[i];
   }

   sort(s.rbegin(), s.rend());

   auto dp = make_v<GF>(n+1, x+1);
   dp[0][x] = 1;
   for (int i = 0; i < n; ++i) {
      for (int j = 0; j <= x; ++j) {
         dp[i+1][j % s[i]] += dp[i][j];
         dp[i+1][j] += dp[i][j] * (n-1-i);
      }
   }

   GF ans = 0;
   for (int i = 0; i <= x; ++i) {
      ans += dp[n][i] * i;
   }
   cout << ans << endl;

   return 0;
}


Measured memory_bytes: 158592