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 Python (3.4.3) (judge verdict: Wrong Answer)

# -*- coding: utf-8 -*-
import bisect
import heapq
import math
import random
import sys
from collections import Counter, defaultdict, deque
from decimal import ROUND_CEILING, ROUND_HALF_UP, Decimal
from functools import lru_cache, reduce
from itertools import combinations, combinations_with_replacement, product, permutations
from operator import add, mul, sub
from fractions import gcd

sys.setrecursionlimit(100000)
input = sys.stdin.readline
INF = 2**62-1


def read_int():
    return int(input())


def read_int_n():
    return list(map(int, input().split()))


def read_float():
    return float(input())


def read_float_n():
    return list(map(float, input().split()))


def read_str():
    return input().strip()


def read_str_n():
    return list(map(str, input().split()))


def error_print(*args):
    print(*args, file=sys.stderr)


def mt(f):
    import time

    def wrap(*args, **kwargs):
        s = time.time()
        ret = f(*args, **kwargs)
        e = time.time()

        error_print(e - s, 'sec')
        return ret

    return wrap


@mt
def slv(N, M, A):
    b = A[0] % 4
    for a in A:
        if a % 4 != b:
            error_print('a')
            return 0
    c = set(2 ** i for i in range(3, 50))

    A = set(A)
    e = 0
    for a in A:
        if a in c:
            e += 1
    if e > 0 and len(A) > 1:
        return 0

    d = reduce(gcd, A)
    d = reduce(lambda x, y: x * y//d, A)
    ans = 0
    if M - d//2 > 0:
        ans = (M-d//2) // d
    if d // 2 < M:
        ans += 1

    return ans


def slv2(N, M, A):
    ans = set()
    A = A[:]
    a = A.pop()
    b = a // 2
    while b <= M:
        ans.add(b)
        b += a

    print(sorted(ans))
    while A:
        a = A.pop()
        b = a // 2
        tmp = set()
        while b <= M:
            tmp.add(b)
            b += a
        ans = ans & tmp
        print(sorted(tmp))
    return len(ans)

def main():
    N, M = read_int_n()
    A = read_int_n()
    print(slv(N, M, A))
    # print(slv2(N, M, A))

    # N = 2
    # M = 1000
    # A = [random.randint(1, 5) * 4 for _ in range(N)]
    # A = [8, 12]
    # print(A)
    # print(slv(N, M, A))
    # print(slv2(N, M, A))

if __name__ == '__main__':
    main()