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<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<string>
#include<map>
#include<set>
#include<tuple>
#include<cmath>


#define MOD 1000000007
#define INF 1001001001
#define MIN -1001001001
#define rep(i,k,N) for(int i=k;i<N;i++)
#define MP make_pair
#define MT make_tuple //tie,make_tuple は別物
#define PB push_back
#define PF push_front

typedef long long ll;

using namespace std;

int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};

ll gcd(ll x,ll y){
    while(y > 0){
        ll tmp = y;
        y = x % y;
        x = tmp;
    }
    return x;
}

ll lcm(ll x, ll y){
    if(x > 1000000000 || y > 1000000000){
        return 1001001001;
    }
    else return x / gcd(x,y) * y;
}

int main(){
    ll N,M;
    cin>>N>>M;
    vector<ll> a(N);
    rep(i,0,N)cin>>a[i];

    ll t =a[0], n_2=0;
    while(double(t)/2 == t/2){
        n_2++;
        t /= 2;
    }

    ll lcm_2=1;
    rep(i,0,n_2){
        lcm_2 *=2; 
    }

    bool ok =true;

    rep(i,1,N){
        double c = a[i];
        if(!(c / double(lcm_2) == a[i] / lcm_2 && c / double(lcm_2*2) != (a[i] / (lcm_2*2)))){
            ok = false;
        }
    }
    ll lcm_ans=a[0]/2;
    if(ok){
        rep(i,0,N){
            a[i] /= 2;
        }
        rep(i,1,N){
            lcm_ans = lcm(lcm_ans,a[i]);
        }
        cout<<(M/lcm_ans-1)/2+1;
    }
    else cout<<0;

    return 0;
}