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;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AtCoder2 {
	class Program {
		static void Main(string[] args) {

var inputArray = retreiveLongArray();
			var inputCount = 2;

			// 不正な入力は処理しない
			if (inputArray.Length != inputCount) {
				Console.WriteLine("invalid input");
				return;
			}

			var N = inputArray[0];
			var M = inputArray[1];

			var numArray = retreiveLongArray();

			//2で割れる回数が同じであることを確認する。
			var divTwoCount = divideTwoCount(numArray[0]);
			var divTwoCountflag = numArray.Select(x => divTwoCount == divideTwoCount(x)).All(x =>x);

			//2で割れる数が同じでない場合は、半公倍数は存在しない
			if (!divTwoCountflag) {
				Console.WriteLine(0);
				return;
			}

			var divideNum = (long)Math.Pow(2, divTwoCount);
			//計算量を抑えるために、すべての数を2でできるだけ割っておく

			var numArray2 = numArray.Select(x => x / divideNum).ToArray();

			//最小公倍数を求める
			long lcm = 1;
			for (int i = 0; i < N; i++) {
				lcm = getLcm(lcm, numArray2[i]);
			}
			var M2 = M / (divideNum / 2);
			var ans = ((M2/lcm)+1)/2;

			//答えの出力
			Console.WriteLine(ans);

		}

		/// <summary>
		/// 2で割れる回数を求める
		/// </summary>
		/// <param name="n"></param>
		/// <returns></returns>
		private static long divideTwoCount(long n) {
			var count = 0;
			while (true) {
				if (n%2 ==1) {
					return count;
				}
				n = n / 2;
				count++;
			}
		}


		/// <summary>
		/// 最小公倍数を返す
		/// </summary>
		/// <param name="a"></param>
		/// <param name="b"></param>
		/// <returns></returns>
		private static long getLcm(long a, long b) {
			return (a * b / getGcd(a, b));
		}

		/// <summary>
		/// 最大公約数
		/// </summary>
		/// <param name="a"></param>
		/// <param name="b"></param>
		/// <returns></returns>
		static long getGcd(long a, long b) {
			if (a < b) {
				return getGcd(b, a);
			}
			if (b > 0) {
				return getGcd(b, a % b);
			}
			else {
				return a;
			}
		}

		/// <summary>
		/// スペースで区切られた文字列配列の入力を受け取る
		/// </summary>
		/// <returns></returns>
		private static string[] retreiveStringArray() {
			var inputArray = Console.ReadLine().Split(' ');
			return inputArray;
		}

		/// <summary>
		/// スペースで区切られた整数配列の入力を受け取る
		/// </summary>
		/// <returns></returns>
		private static long[] retreiveLongArray() {
			var inputArray = Console.ReadLine().Split(' ');
			var longArray = inputArray.Select(s => long.Parse(s));
			return longArray.ToArray();
		}
	}
}