inputs = (gets).split(" ")
nn = inputs[0].to_i
xx = inputs[1].to_i

inputs = (gets).split(" ")
si = inputs.map{|istr| istr.to_i}
si.sort!

dp = []
=begin
例えばnn=1だったとき、黒板の文字は x mod s0 である。
ではdp[0,x] = x mod s0 にするかというと、それはいろいろ大変なことになる。
ところでdp[0,x]をよく眺めていると、0..s0-1という数列が循環していることに気付く。
なので dp[0,x]=x, dp[1,x]=dp[0,x%s0], ということにするといろいろ便利になる。
=end
dp[0] = Array.new(xx+1){|x| x}
#p dp[0]

# メモ空間のすべてを計算する必要はないが、アクセスする分は計算する必要がある
uq = [xx]
while true
    xa = uq.dup
    xa.each do |x|
      si.each do |s|
        uq << x.modulo(s)
      end
    end
    uq.uniq!
    #p uq
    break if uq.length == xa.length
end
xa = uq
xa.sort!.reverse!

# dp(i+1,x) = dp(i,x%s_i) + dp(i,x)
1.upto(nn) do |i|
  dp[i] = Array.new(xa.length){0} #とりあえず
  st = si[i-1]
  #1.upto(xx) do |x|
  # 全部やらないで先に計算したアクセスしそうな場所だけ計算する
  xa.each do |x|
    # 上記の説明＋実際に数列を書いてみるとこれに行きつく
    dp[i][x] = (dp[i-1][x]*(i-1) + dp[i-1][x.modulo(st)]).modulo(1000000007)
  end
  #p dp[i]
end

puts dp[nn][xx]