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

#include <stdio.h>
#include <stdlib.h>

int main() {

 long long int A=0;
 long long int B=0;
 long long int C=0;
 long long int D=0;
 long long int LCM=0;
 long long int ANS=0;

 //入力
 int ret = scanf("%lld %lld %lld %lld", &A , &B , &C , &D);
 if( ret == EOF ) {
    printf( "scanfでエラー\n" );
    return -1;
  }
 
 //CとDの最大公約数を求める(n)
 long long int m=C;
 long long int n=D;
 long long int temp=0;
 //m>nとなるように入替
 if(m<n){
  temp=m;
  m=n;
  n=temp;
 }
 temp = m % n;
 while (temp != 0)
 {
 	m = n;
	n = temp;
	temp = m % n;
 }
 if (n != 0){
  //最大公約数
   LCM = C * D / n;
   ANS = (B-A+1) - (B/C - (A-1)/C) - (B/D - (A-1)/D) + (B/LCM - (A-1)/LCM);
 }
 else if(n == 0){
  ANS = (B-A+1) - (B/C - (A-1)/C) - (B/D - (A-1)/D);
 }

 printf("%lld",ANS);

 return (0);
}