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: Wrong Answer)

use std::io::*;
use std::str::*;

fn read<T: FromStr>(s: &mut StdinLock) -> Option<T> {
    let s = s
        .by_ref()
        .bytes()
        .map(|c| c.unwrap() as char)
        .skip_while(|c| c.is_whitespace())
        .take_while(|c| !c.is_whitespace())
        .collect::<String>();
    s.parse::<T>().ok()
}

fn main() {
    let stdin = stdin();
    let a = read::<String>(&mut stdin.lock());
    let b = read::<String>(&mut stdin.lock());
    let c = read::<String>(&mut stdin.lock());
    let d = read::<String>(&mut stdin.lock());
    let a = a.unwrap();
    let b = b.unwrap();
    let c = c.unwrap();
    let d = d.unwrap();
    let a: i64 = a.parse().unwrap();
    let b: i64 = b.parse().unwrap();
    let c: i64 = c.parse().unwrap();
    let d: i64 = d.parse().unwrap();

    // inludes edge
    let range_start = a as i64;
    let range_end = b as i64;

    let mut c_ok = true;
    let mut d_ok = true;

    let mut v_c = Vec::new();
    let mut v_d = Vec::new();

    if c == 1 || d == 1 {
        println!("0");
    }

    for i in 1..range_end + 1 {
        let ci = c * i as i64;
        if range_start <= ci && ci <= range_end {
            if c_ok {
                if !v_d.contains(&ci) {
                    v_c.push(ci);
                    //println!("{}", ci);
                }
            }
        } else if range_end < ci {
            c_ok = false;
        }

        let di = d * i as i64;

        if range_start <= di && di <= range_end {
            if d_ok {
                if !v_c.contains(&di) {
                    v_d.push(di);
                    //println!("{}", di);
                }
            }
        } else if range_end < di {
            d_ok = false;
        }
    }
    println!(
        "{}",
        (range_end - range_start + 1) - (v_d.len() as i64 + v_c.len() as i64)
    );
}