Problem:
Score : 400 points

Problem Statement

Given are a sequence A= {a_1,a_2,......a_N} of N positive even numbers, and an integer M.

Let a semi-common multiple of A be a positive integer X that satisfies the following condition for every k (1 \leq k \leq N):

There exists a non-negative integer p such that X= a_k \times (p+0.5).

Find the number of semi-common multiples of A among the integers between 1 and M (inclusive).

Constraints

1 \leq N \leq 10^5

1 \leq M \leq 10^9

2 \leq a_i \leq 10^9

a_i is an even number.

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N M
a_1 a_2 ... a_N

Output

Print the number of semi-common multiples of A among the integers between 1 and M (inclusive).

Sample Input 1

2 50
6 10

Sample Output 1

2

15 = 6 \times 2.5

15 = 10 \times 1.5

45 = 6 \times 7.5

45 = 10 \times 4.5

Thus, 15 and 45 are semi-common multiples of A. There are no other semi-common multiples of A between 1 and 50, so the answer is 2.

Sample Input 2

3 100
14 22 40

Sample Output 2

0

The answer can be 0.

Sample Input 3

5 1000000000
6 6 2 6 2

Sample Output 3

166666667

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

using System;
using System.Linq;
using System.Collections.Generic;
class ProgramD
    {
        static void Main(string[] args)
        {
            
            //入力
            string[] input = Console.ReadLine().Split(' ');
            int n = int.Parse(input[0]);
            ulong m = ulong.Parse(input[1]);

            
            string[] input_a = Console.ReadLine().Split(' ');
            ulong[] ai = new ulong[n];
            ulong[] bi = new ulong[n];
            for(int i = 0;i < n;i++)
            {
                ai[i] = ulong.Parse(input_a[i]) / 2;
                bi[i] = ai[i];
            }
          
          
            
            if(n == 1)
            {
                if(ai[0] > m)
                    Console.WriteLine('0');
                else
                    Console.WriteLine((m - ai[0]) / 2 / ai[0] + 1);
                return;
            }
          
            for(int j = 0; j < 50;j++)
            {
                int count = 0;
                for(int i = 0;i < n;i++)
                {
                    int temp = (int)(bi[i] % 2);
                    if(temp == 0)
                    {
                        count++;
                        bi[i] /= 2;
                    }
                }
                if(count != 0 && count != n)
                    {
                        Console.WriteLine('0');
                        return;
                    }
            }

            Array.Sort(ai);
            ulong a = ai[n - 1];
            ulong b = ai[n - 2];
            ulong tempa = a;
            ulong tempb = b;
            ulong r = 1;

            while( r != 0 ) 
            {
                r = a % b;
                a = b;
                b = r;
            }

            a = tempa * tempb / a;
            
            if(a > m)
                {
                    Console.WriteLine('0');
                    return;
                }

            for(int i = n - 3;i >= 0; i--)
            {
                ulong temp2a = a;
                b = ai[i];
                ulong temp2b = ai[i];
                r = 1;
                while( r != 0 ) 
                {
                    r = a % b;
                    a = b;
                    b = r;
                }

                a = temp2a * temp2b / a;

                if(a > m)
                {
                    Console.WriteLine('0');
                    return;
                }

            }
        Console.WriteLine((m - a) / 2 / a + 1);
        }
        
    }