import sys

sys.setrecursionlimit(10 ** 7)

read = sys.stdin.buffer.read 

inp = sys.stdin.buffer.readline

def inputS(): return input().rstrip().decode()

readlines = sys.stdin.buffer.readlines 





def gcd(a, b):

  while b:

    a, b = b, a%b

  return a



def lcm(a, b):

  return a*b // gcd(a, b)



def div2cnt(a):

  cnt = 0

  while a%2 == 0:

    a //= 2

    cnt += 1

  return cnt



N, M = list(map(int, inp().split()))

A = list(map(int, inp().split()))

# 2で割ったものに置き換え a -> a'

Ad = [a//2 for a in A]



# 各要素について、2で割り切れる回数が等しいかチェック

div2 = div2cnt(Ad[0])

for a in Ad:

  if div2cnt(a) != div2:

    print((0))

    exit()

    

# LCM

_lcm = Ad[0]

for a in Ad:

  _lcm = lcm(_lcm, a)

if _lcm > M:

  print((0))

  exit()

  

print(((M//_lcm + 1) // 2))   # 切り上げ





def resolve():

    def gcd(a, b):

        while b:

            a, b = b, a % b

        return a



    def lcm(a, b):

        return a * b // gcd(a, b)



    N, M = list(map(int, input().split()))

    A = list(map(int, input().split()))

    # Aは偶数。2*Bと書ける。少数をなくすため, B*(2p + 1)と式変形

    # 2を使用した為、2で割る

    B = [a//2 for a in A]



    # X = B[k] * (2p + 1)

    # これを見てみると、B[k]の奇数倍の数が作られることになる。

    # 公倍数は最小公倍数の倍数となるという性質がある。

    # 全部の数の最小公倍数を取って、M÷最小公倍数をすると答えが得られる。

    def solve():

        lc = 1

        for i in range(N):

            lc = lcm(lc, B[i])



        # 変形式より、XはB*奇数倍されないといけないX//B[k] == (2p+1)

        # なので、偶数になるとダメ

        for i in range(N):

            if (lc//B[i]) % 2 == 0:

                return 0

        ans = M//lc

        ans = (ans+1)//2

        return ans



    print((solve()))



if __name__ == "__main__":

    resolve()
import sys

sys.setrecursionlimit(10**7)
read = sys.stdin.buffer.read
inp = sys.stdin.buffer.readline


def inputS():
    return input().rstrip().decode()


readlines = sys.stdin.buffer.readlines


def gcd(a, b):
    while b:
        a, b = b, a % b
    return a


def lcm(a, b):
    return a * b // gcd(a, b)


def div2cnt(a):
    cnt = 0
    while a % 2 == 0:
        a //= 2
        cnt += 1
    return cnt


N, M = list(map(int, inp().split()))
A = list(map(int, inp().split()))
# 2で割ったものに置き換え a -> a'
Ad = [a // 2 for a in A]
# 各要素について、2で割り切れる回数が等しいかチェック
div2 = div2cnt(Ad[0])
for a in Ad:
    if div2cnt(a) != div2:
        print((0))
        exit()
# LCM
_lcm = Ad[0]
for a in Ad:
    _lcm = lcm(_lcm, a)
if _lcm > M:
    print((0))
    exit()
print(((M // _lcm + 1) // 2))  # 切り上げ

def resolve():
    def gcd(a, b):
        while b:
            a, b = b, a % b
        return a

    def lcm(a, b):
        return a * b // gcd(a, b)

    N, M = list(map(int, input().split()))
    A = list(map(int, input().split()))
    # Aは偶数。2*Bと書ける。少数をなくすため, B*(2p + 1)と式変形
    # 2を使用した為、2で割る
    B = [a // 2 for a in A]
    # X = B[k] * (2p + 1)
    # これを見てみると、B[k]の奇数倍の数が作られることになる。
    # 公倍数は最小公倍数の倍数となるという性質がある。
    # 全部の数の最小公倍数を取って、M÷最小公倍数をすると答えが得られる。
    def solve():
        lc = 1
        for i in range(N):
            lc = lcm(lc, B[i])
        # 変形式より、XはB*奇数倍されないといけないX//B[k] == (2p+1)
        # なので、偶数になるとダメ
        for i in range(N):
            if (lc // B[i]) % 2 == 0:
                return 0
        ans = M // lc
        ans = (ans + 1) // 2
        return ans

    print((solve()))


if __name__ == "__main__":
    resolve()

-import sys +def resolve(): +    def gcd(a, b): +        while b: +            a, b = b, a % b +        return a -sys.setrecursionlimit(10**7) -read = sys.stdin.buffer.read -inp = sys.stdin.buffer.readline +    def lcm(a, b): +        return a * b // gcd(a, b) + +    N, M = list(map(int, input().split())) +    A = list(map(int, input().split())) +    # Aは偶数。2*Bと書ける。少数をなくすため, B*(2p + 1)と式変形 +    # 2を使用した為、2で割る +    B = [a // 2 for a in A] +    # X = B[k] * (2p + 1) +    # これを見てみると、B[k]の奇数倍の数が作られることになる。 +    # 公倍数は最小公倍数の倍数となるという性質がある。 +    # 全部の数の最小公倍数を取って、M÷最小公倍数をすると答えが得られる。 +    def solve(): +        lc = 1 +        for i in range(N): +            lc = lcm(lc, B[i]) +        # 変形式より、XはB*奇数倍されないといけないX//B[k] == (2p+1) +        # なので、偶数になるとダメ +        for i in range(N): +            if (lc // B[i]) % 2 == 0: +                return 0 +        ans = M // lc +        ans = (ans + 1) // 2 +        return ans + +    print((solve())) -def inputS(): -    return input().rstrip().decode() - - -readlines = sys.stdin.buffer.readlines - - -def gcd(a, b): -    while b: -        a, b = b, a % b -    return a - - -def lcm(a, b): -    return a * b // gcd(a, b) - - -def div2cnt(a): -    cnt = 0 -    while a % 2 == 0: -        a //= 2 -        cnt += 1 -    return cnt - - -N, M = list(map(int, inp().split())) -A = list(map(int, inp().split())) -# 2で割ったものに置き換え a -> a' -Ad = [a // 2 for a in A] -# 各要素について、2で割り切れる回数が等しいかチェック -div2 = div2cnt(Ad[0]) -for a in Ad: -    if div2cnt(a) != div2: -        print((0)) -        exit() -# LCM -_lcm = Ad[0] -for a in Ad: -    _lcm = lcm(_lcm, a) -if _lcm > M: -    print((0)) -    exit() -print(((M // _lcm + 1) // 2))  # 切り上げ +if __name__ == "__main__": +    resolve()