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++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include <bits/stdc++.h>

using namespace std;

long long n, m, a[100001], A[100001][3], ans;
long long usj = 1;

long long gcd(long long a, long long b) 
{ 
    if (b == 0) return a; 
    return gcd(b, a % b); 
}
long long  findlcm(long long arr[], long long n) 
{
    long long ans = arr[1]; 
    for (int i = 1; i <= n; i++){
        ans = (((arr[i] * ans)) / 
                (gcd(arr[i], ans))); 
        if (ans > m)
        	return 0;
	}
    return ans; 
}

int main () {
	cin >> n >> m;
	for (int i=1; i<=n; i++){
		cin >> a[i];
		a[i] = a[i]/2;
		while (a[i]%2==0){
			a[i]=a[i]/2;
			A[i][2]++;
		}
	}
	
	
	for (int i=1; i<=n; i++){
		if (A[i][2] != A[i+1][2]){
			cout << 0;
			return 0;
		}
	}
	
	long long k = pow(2.0, A[1][2]);
	if (k > m){
		cout << 0;
		return 0;
	}
	usj = usj*k;
	
	usj = usj*findlcm(a, n);
	
	if (usj == 0){
		cout << 0;
		return 0;
	}
	
	if (usj > m){
		cout << 0;
		return 0;
	}
	
	ans = (m/usj);
	if (ans%2 == 0){
		cout << ans/2 << endl;
		return 0;
	}
	
	cout << ans/2+1 << endl;
	
}