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;
using ll = long long;
using ld = long double;
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define IFOR(i,a,b) for(int i=(b-1);i>=(a);--i)
#define RPT(i,a,b) for(int i=(a);i<((a)+(b));++i)
#define IRPT(i,a,b) for(int i=((a)+(b)-1);i>=(a);--i)
#define BITBOOL(x,a) (((x)>>(a))&1)
constexpr int INF = (1 << 29);
constexpr ll INF_ = (1LL << 58);
constexpr ld EPS = (1e-10);
constexpr ld PI_ = 3.141592653589793238;//46264338327950288
constexpr ld E_ = 2.71828182845904523;//5360287471352
int intlog(int a, int k){
  int ans = 0;
  while(a%k==0){
    a /= k;
    ans++;
  }
  return ans;
}
int main(){
  int N, M; set<int> A; set<int> prm;
  cin >> N >> M;
  int index_2 = 0;
  RPT(i,0,N){
    int a; cin >> a;
    if(i==0) { A.insert(a/2); index_2=intlog(a/2,2); continue; }
    if( index_2!=intlog(a/2,2) ){ cout << 0 << endl; return 0; }
    A.insert(a/2);
  }
  FOR(i,2,100005){
    int flg = 1;
    for(auto x : prm){
      if(i%x==0){flg = 0; break;}
      if(x*x>i) break;
    }
    if(flg) prm.insert(i);
  }
  map<int,int> Xmin;ll Tmin=1;
  for(auto b : A){
    int a = b;
    for(auto x: prm){
      int cnt = intlog(a,x);
      if( cnt != 0){
        RPT(j,0,cnt) a /= x;
      }
      if(Xmin[x]<cnt) {RPT(ii,0,cnt-Xmin[x])Tmin*=x;Xmin[x] = cnt;}
      if(a == 1) break;
    }
  }//cout << Tmin << "=";for(auto x : prm){ if(Xmin[x]!=0) cout << x << "^" << Xmin[x] << " ";}
  if(Tmin>M) {cout << 0 << endl; return 0;}
  ll l_ = 0, r_ = ( (Tmin+M-1)/2/Tmin + 20);
  while(r_-l_>1){
    ll mid_ = (l_ + r_) / 2;
    if( Tmin*(2*mid_+1) > M ) r_ = mid_;
    else l_ = mid_;
  }
  cout << (l_+1) << endl;
  return 0;
}