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: Runtime Error)


#include<stdio.h>

long int max;

void set_data(long int data[], int n){
    for(int i = 0; i < n; i++){
        scanf("%ld", &data[i]);
    }
}

int calc_lcm(long int data[], int n){
    int lcm, judge = 1;
    max = data[0];
    for(int i = 0; i < n; i++){
        if(max < data[i]){
            max = data[i];
        }
    }
    for(int i = 1; i < max; i++){
        for(int j  = 0; j < n; j++){
            if(data[j] % i != 0){
                judge = 0;
                break;
            }
        }
        if(judge){
            lcm = i;
        }
    }
    return lcm;
}



long int calc_gcd(long int data[], int n){
    int lcm = calc_lcm(data, n), flag[max];
    for(int i = 0; i < n; i++){
        flag[data[i] - 1] = 1;
    }
    long int gcd = 1;
    for(int i = 0; i < n; i++){
        if(flag[data[i] - 1] == 1){
            gcd *= data[i];
            flag[data[i] - 1] = 0;
        }
    }
    return gcd / lcm;
}

void count_SCM(long int data[], int n, long int m){
    int cnt = 0, judge = 1;
    long int gcd = 1;
    gcd = calc_gcd(data, n);
    for(int i = 1; gcd * i <= m * 2; i += 2){
        for(int j = 0; j < n; j++){
            if((gcd * i) % data[j] != 0){
                judge = 0;
                break;
            }
        }
        if(judge == 1){
            cnt ++;
        }
    }
    printf("%d\n", cnt);
}

void print_array(long int data[], int n){
    for(int i = 0; i < n; i++){
        printf("%ld ", data[i]);
    }
    printf("\n");
}

int main(void){
    int n;
    long int m;
    scanf("%d""%ld", &n, &m);
    long int data[n];
    set_data(data, n);
    /*print_array(data, n);*/
    count_SCM(data, n, m);
    return 0;

}