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

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

unsigned int least_common_multiple(unsigned long num1, unsigned long num2);

unsigned int least_common_multiple(unsigned long num1, unsigned long num2)
{
	unsigned long large, small, lcm;
	if(num1>num2){
		large = num1;
		small = num2;
	}
	else{
		large = num2;
		small = num1;
	}
	int i=1;
	lcm = large;
	//printf("large:%lu, small:%lu, lcm:%lu\n", large, small, lcm);
	while(lcm%small != 0){
		i++;
		lcm = large*i;
		//printf("%lu\n", lcm);
	}
	//printf("%lu\n", lcm);
	
	return (lcm);
}

int main(){
	unsigned long a, b, c, d, lcm, answer;
	scanf("%lu%lu%lu%lu", &a, &b, &c, &d);
	
	unsigned int smallest, largest, num_c, num_d, num_cd;
	if(a%c == 0) smallest = a/c;
	else smallest = a/c+1;
	largest = b/c;
	if(largest>=smallest) num_c = largest-smallest+1;
	else num_c = 0;
	
	if(a%d == 0) smallest = a/d;
	else smallest = a/d+1;
	largest = b/d;
	if(largest>=smallest) num_d = largest-smallest+1;
	else num_d = 0;
	
	lcm = least_common_multiple(c, d);
	if(a%lcm == 0) smallest = a/lcm;
	else smallest = a/lcm+1;
	largest = b/lcm;
	if(largest>=smallest) num_cd = largest-smallest+1;
	else num_cd = 0;
	//printf("c:%lu, d:%lu, lcm:%lu, cd:%lu\n", num_c, num_d, lcm, num_cd); 
	
	answer = b-a+1-num_c-num_d+num_cd;
	
	printf("%lu\n", answer);
	
	return 0;
}