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 Java8 (OpenJDK 1.8.0) (judge verdict: Time Limit Exceeded)

import java.util.Scanner;

public class Main {
  public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    long A = scan.nextLong();
    long B = scan.nextLong();
    long C = scan.nextLong();
    long D = scan.nextLong();
    long CD = lcm(C , D);

    long cStart = 0;
    long dStart = 0;
    long cdStart = 0;
    long cEnd = 0;
    long dEnd = 0;
    long cdEnd = 0;

    long i = 1;
    long j = 1;
    long k = 1;

    while(true) {
      if (i * C >= A) {
        cStart = i;
        break;
      }
      i++;
    }
    while(true) {
      if (i * C > B) {
        cEnd = i - 1;
        break;
      }
      i++;
    }

    while(true) {
      if (j * D >= A) {
        dStart = j;
        break;
      }
      j++;
    }
    while(true) {
      if (j * D > B) {
        dEnd = j - 1;
        break;
      }
      j++;
    }


    while(true) {
      if (k * CD >= A) {
        cdStart = k;
        break;
      }
      k++;
    }
    while(true) {
      if (k * CD > B) {
        cdEnd = k - 1;
        break;
      }
      k++;
    }

//    System.out.println(cEnd);
//    System.out.println(cStart);
//    System.out.println(dEnd);
//    System.out.println(dStart);
//    System.out.println(cdEnd);
//    System.out.println(cdStart);

    long cn = cEnd - cStart + 1;

    long dn = dEnd - dStart + 1;

    long cdn = cdEnd - cdStart;
    if(cdn != 1) {
      cdn++;
    }

    long result = B - A + 1 - cn - dn + cdn;




//    for(int i = (int) A; i <= B; i++) {
//      if(i % CD == 0 || i % C == 0 || i % D == 0) {
//        // nothing
//      } else {
//        count++;
//      }
//    }

    System.out.println(result);

  }

  static long lcm (long a, long b) {
    long temp;
    long c = a;
    c *= b;
    while((temp = a%b)!=0) {
      a = b;
      b = temp;
    }
    return (long)(c/b);
  }
}