Problem:
Score : 300 points

Problem Statement

You are given four integers A, B, C, and D. Find the number of integers between A and B (inclusive) that can be evenly divided by neither C nor D.

Constraints

1\leq A\leq B\leq 10^{18}

1\leq C,D\leq 10^9

All values in input are integers.

Input

Input is given from Standard Input in the following format:

A B C D

Output

Print the number of integers between A and B (inclusive) that can be evenly divided by neither C nor D.

Sample Input 1

4 9 2 3

Sample Output 1

2

5 and 7 satisfy the condition.

Sample Input 2

10 40 6 8

Sample Output 2

23

Sample Input 3

314159265358979323 846264338327950288 419716939 937510582

Sample Output 3

532105071133627368

Solution in Rust (1.15.1) (judge verdict: Accepted)

use std::io::stdin;

fn gcd(a: isize, b: isize) -> isize {
    if a == 0 {
        b
    } else {
        gcd(b % a, a)
    }
}

fn lcm(a: isize, b: isize) -> isize {
    a * b / gcd(a, b)
}

fn calc(l: isize, vals: &Vec<isize>) -> isize {
    let mut ret = 0;
    for (i, &v1) in vals.iter().enumerate() {
        ret += l / v1;
        for &v2 in vals.iter().skip(i + 1) {
            ret -= l / lcm(v1, v2);
        }
    }
    return ret;
}

fn main() {
    let mut x = String::new();
    stdin().read_line(&mut x).unwrap();
    let x: Vec<isize> = x.trim().split_whitespace().flat_map(str::parse).collect();
    let (a, b, c, d) = (x[0], x[1], x[2], x[3]);

    let vals = vec![c, d];
    println!("{}", (b - calc(b, &vals)) - (a - 1 - calc(a - 1, &vals)));
}