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 Java8 (OpenJDK 1.8.0) (judge verdict: Wrong Answer)

import java.util.*;
public class Main {
        static Scanner sc = new Scanner(System.in);
        static void myout(Object t){System.out.println(t);}//standard output
        static void myerr(Object t){System.err.println(t);}//standard error
        static String getStr(){return sc.next();}
        static int getInt(){return Integer.parseInt(getStr());}
        static Long getLong(){return Long.parseLong(getStr());}
        static boolean isNext(){return sc.hasNext();}
        static char[] splitSingle(String str){return str.toCharArray();}//equalsが使えんので要改修
        public static void main(String[] args){
  int N = getInt();
  int M = getInt();
  long[] list = new long[N];
          for(int i = 0; i < N; i++){
            list[i] = getLong();
          }
  boolean odd = false;
  boolean even = false;
  long lcmed = list[0];
  if((list[0] / 2) % 2 == 0){even = true;}else{odd = true;}      
  long han = 0;
  for(int i = 1; i < N; i++){
    if((list[i] / 2) % 2 == 0){even = true;}else{odd = true;}
    if(even == true && odd == true){
      myout(0);
      return;
    }
    lcmed = lcm(lcmed,list[i]);
    myerr(lcmed);
    han = lcmed /2;
  }
    if(M < han){
      myout(0);
      return;
    }
  M -= han;
          if(M < lcmed){
            myout(1);
            return;
          }else{
  			myout((int)(M / lcmed) + 1);
          }
        }
        //便利メソッド追加枠ここから
public static long lcm(long m, long n) {return Math.max(m,n) / gcd(m, n) * Math.min(m,n);}
  public static long gcd(long m, long n) {return n != 0 ? gcd(n, m % n) : m;}
        //便利メソッド追加枠ここまで
}