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.Collections.Generic;
class Program
{
	static void Main(string[] args)
	{
		string[] str = Console.ReadLine().Split();
		int N = int.Parse(str[0]);
		long M = long.Parse(str[1]);
		var list = new HashSet<long>();
		string[] str2 = Console.ReadLine().Split();
		for(var i=0;i<N;i++){
			list.Add(long.Parse(str2[i]));
		}
		long ans = 0;
		var list2 = new List<long>();
		foreach(var i in list){
			list2.Add(i);
		}
		long L = list2[0];
		for(var i=1;i<list2.Count;i++){
			L = Lcm(L,list2[i]);
			if(L>M*2){
				L = 0;
				break;
			}
		}
		if(L>0){
			ans = (L/2+M)/L;
		}
		var hs1 = new HashSet<int>();
		foreach(var i in list){
			long i1 = i;
			int ct = 0;
			while(i1%2==0){
				ct++;
				i1 /= 2;
			}
			hs1.Add(ct);
		}
		if(hs1.Count>=2){
			ans = 0;
		}
		Console.WriteLine(ans);
	}
	
	public static long Gcd(long a, long b) {
		if (a < b)
			return Gcd(b, a);
		while (b != 0) {
			var r = a % b;
			a = b;
			b = r;
		}
		return a;
	}
	public static long Lcm(long a, long b) {
        return a * b / Gcd(a, b);
    }
}