Problem:
Score : 600 points

Problem Statement

Snuke has a blackboard and a set S consisting of N integers.
The i-th element in S is S_i.

He wrote an integer X on the blackboard, then performed the following operation N times:

Choose one element from S and remove it.

Let x be the number written on the blackboard now, and y be the integer removed from S. Replace the number on the blackboard with x \bmod {y}.

There are N! possible orders in which the elements are removed from S.
For each of them, find the number that would be written on the blackboard after the N operations, and compute the sum of all those N! numbers modulo 10^{9}+7.

Constraints

All values in input are integers.

1 \leq N \leq 200

1 \leq S_i, X \leq 10^{5}

S_i are pairwise distinct.

Input

Input is given from Standard Input in the following format:

N X
S_1 S_2 \ldots S_{N}

Output

Print the answer.

Sample Input 1

2 19
3 7

Sample Output 1

3

There are two possible orders in which we remove the numbers from S.

If we remove 3 and 7 in this order, the number on the blackboard changes as follows: 19 \rightarrow 1 \rightarrow 1.

If we remove 7 and 3 in this order, the number on the blackboard changes as follows: 19 \rightarrow 5 \rightarrow 2.

The output should be the sum of these: 3.

Sample Input 2

5 82
22 11 6 5 13

Sample Output 2

288

Sample Input 3

10 100000
50000 50001 50002 50003 50004 50005 50006 50007 50008 50009

Sample Output 3

279669259

Be sure to compute the sum modulo 10^{9}+7.

Solution in C# (Mono 4.6.2.0) (judge verdict: Accepted)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Exawizards
{
    class D
    {
        static int _Mod = 1000000007;

        static void Main(string[] args)
        {
            int[] a = Console.ReadLine().Split(' ').Select(z => int.Parse(z)).ToArray();
            int N = a[0], X = a[1];
            List<int> S = Console.ReadLine().Split(' ').Select(z => int.Parse(z)).ToList();
            S = S.OrderByDescending(z => z).ToList();
            
            Dictionary<int, long> dic = new Dictionary<int, long>();
            long[] num = new long[X + 1];
            num[X] = 1;
            for (int i = 0; i < N; i++)
            {
                for (int k = 0; k <= X; k++)
                {
                    int m = S[i];
                    int nw = k % m;

                    long c = num[k];

                    num[nw] += c;
                    num[nw] %= _Mod;
                    num[k] += c * (N - i - 2);
                    num[k] %= _Mod;
                }
                //Console.WriteLine(num.Sum());
            }
            //期待値
            long sum=num.Select((x, i) => x * i).Sum();
            sum %= _Mod;
            Console.WriteLine(sum);

            //long sum = 0;
            //List<string> list = MakePermutation(N);
            //foreach(string p in list)
            //{
            //    string s = "";
            //    int x = X;
            //    int[] id = p.ToCharArray().Select(z => z - '0').ToArray();
            //    for(int i = 0; i < N; i++)
            //    {
            //        int index = id[i] - 1;
            //        int k = S[index];
            //        x %= k;
            //        s += " " + k;
            //    }
            //    sum += x;
            //    Console.WriteLine(s + " " + x);
            //}


        }

        //階乗n!(mod p)のベクトル
        public static List<long> Factorial(int n)
        {
            long x = 1;
            List<long> list = new List<long>();
            list.Add(x);
            for (int i = 1; i <= n; i++)
            {
                x = (x * i) % _Mod;
                list.Add(x);
            }
            return list;
        }

        //9までの順列を全列挙
        static List<string> MakePermutation(int n)
        {
            List<List<int>> current = new List<List<int>>();
            current.Add(new List<int> { 1 });
            for (int i = 2; i <= n; i++)
            {
                List<List<int>> next = new List<List<int>>();
                List<int> newList = new List<int>();

                foreach (List<int> list in current)
                {
                    for (int j = 0; j <= list.Count; j++)
                    {
                        List<int> ilist = new List<int>(list);
                        ilist.Insert(j, i);
                        next.Add(ilist);
                    }
                }
                current = next;
            }
            List<string> arr = current.Select(x => string.Join("", x)).ToList();
            arr.Sort();
            return arr;
        }


    }
}