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 (GCC 5.4.1) (judge verdict: Accepted)

#include <stdio.h>

//素数列挙
//pには充分な要素数の配列のアドレス、返り値は個数
#include <stdbool.h>
#define n0 16000 //上限/2
#define n1 180    //sqrt(上限)/2

int prime(int *p){
  bool fp[n0]={};
  int i,j,np=1,s;
  for(i=0;i<n1;i++){
    if(fp[i]) continue;
    s=(i<<1)+3;
    for(j=(i+1)*3;j<n0;j+=s){
      fp[j]=1;
    }
  }
  p[0]=2;
  for(i=0;i<n0;i+=1){
    if(fp[i]^1){
      p[np]=(i<<1)+3;
      np++;
    }
  }
  return(np);
}
int main(){
  int p[100005],n,a,b,z=0,l[100005]={},np,i,j,m,x=0;
  np=prime(&p);
  scanf("%d",&n);
  scanf("%d",&m);
  for(i=0;i<n;i++){
    scanf("%d",&a);
    a>>=1;
    for(j=0;j<np;j++){
      if(a==1) break;
      b=0;
      while(a%p[j]==0){
        a/=p[j];
        b++;
      }
      if(j==0){
        if(i==0){
          z=b;
        }else if(z!=b){
          z=-1;
          break;
        }
      }
      if(l[j]<b){
        l[j]=b;
      }
    }
    if(a!=1){
      p[np]=a;
      l[np]=1;
      np++;
    }
    if(z==-1) break;
  }
  if(z!=-1){
    x=1;
    for(i=0;i<np;i++){
      for(j=0;j<l[i];j++){
        if((long)x*p[i]>(long)m)break;
        x*=p[i];
      }
      if(j!=l[i]){
        x=0;
        break;
      }
    }
  }
  if(x!=0){
    printf("%d",((m+x)>>1)/x);
  }else{
    printf("0");
  }
  return(0);
}