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++ (GCC 9.2.1) (judge verdict: Accepted)

#include<bits/stdc++.h>
#define endl "\n"
#ifdef ONLINE_JUDGE
#define DEBUG(x)
#else
#define DEBUG(x) cout<<#x<<" : {"<<x<<"}"<<endl;
#endif
using namespace std;
typedef long long int lli;
inline lli binexp(lli a, lli b, lli m){
	lli res = 1LL;
	while(b != 0){
		if(b & 1){
			res *= a;
			if(res > m)
				return -1LL;
			b--;
		}
		else{
			a = a * a;
			b /= 2;
		}
	}
	return res;
}

 
int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	int n, m;
	cin >> n >> m;
	vector<int> v(n);
	for(int i=0; i<n; ++i)	cin >> v[i];
	int factors = 0;
	bool possible = true;
	for(int i=0; i<n; ++i){
		int ele = v[i]/2;
		if(!possible)	break;
		if(ele%2 == 0){
			int cnt = 0;
			while(ele%2 == 0){
				cnt++;
				ele /= 2;
			}
			if(i != 0 && cnt != factors){
				possible = false;
				break;
			}
			factors = cnt;
		}
	}
	if(!possible){
		cout << 0 << endl;
		return 0;
	}
	lli prod = 1LL;
	
	if(!possible)
		cout << 0 << endl;
	else{
		lli l = (lli)v[0]/2;
		for(int i=1; i<n; ++i){
			l = (l * (v[i]/2)) / (__gcd(l, (lli)v[i]/2));
			if(l > m){
				possible = false;
				break;
			}
		}
		if(!possible){
			cout << 0 << endl;
		}
		else{
			lli num = m / (int)l;
			cout << (num + 1)/2 << endl;			
		}

	}
	
	return 0;
}