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


import java.math.BigInteger;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		BigInteger a = new BigInteger(sc.next());
		BigInteger b = new BigInteger(sc.next());
		long c = sc.nextLong();
		long d = sc.nextLong();
		Map<Long, Long> clist = new HashMap<>();
		Map<Long, Long> dlist = new HashMap<>();
		long tmp = c;
		while(tmp != 1) {
			for(long i = 2; i < c + 1; i++) {
				if(tmp % i == 0) {
					if(clist.containsKey(i)) {
						long value = clist.get(i);
						value++;
						clist.put(i, value);
					} else {
						clist.put(i, (long) 1);
					}
					c /= i;
				}
			}
		}
		tmp = d;
		while(tmp != 1) {
			for(long i = 2; i < d + 1; i++) {
				if(tmp % i == 0) {
					if(dlist.containsKey(i)) {
						long value = dlist.get(i);
						value++;
						dlist.put(i, value);
					} else {
						dlist.put(i, (long) 1);
					}
					d /= i;
				}
			}
		}
		BigInteger ans = a.subtract(b).add(new BigInteger("1"));
		BigInteger sub = b.divide(new BigInteger(Long.toString(c))).subtract(a.divide(new BigInteger(Long.toString(c))));
		if(a.mod(new BigInteger(Long.toBinaryString(c))).toString() == "0") {
			sub = sub.add(new BigInteger("1"));
		}
		ans = ans.subtract(sub);
		sub = b.divide(new BigInteger(Long.toString(d))).subtract(a.divide(new BigInteger(Long.toString(d))));
		if(a.mod(new BigInteger(Long.toBinaryString(d))).toString() == "0") {
			sub = sub.add(new BigInteger("1"));
		}
		ans = ans.subtract(sub);
		List<Long> list = new ArrayList<>();
		list.addAll(clist.keySet());
		Map<Long, Long> mul = new HashMap<>();
		while(!list.isEmpty()) {
			long key = list.get(0);
			list.remove(0);
			long cvalue = clist.get(key);
			clist.remove(key);
			if(dlist.containsKey(key)) {
				long dvalue = dlist.get(key);
				dlist.remove(key);
				mul.put(key, Math.max(cvalue, dvalue));
			} else {
				mul.put(key, cvalue);
			}
		}
		BigInteger multi = new BigInteger("1");
		list.clear();
		list.addAll(mul.keySet());
		while(!list.isEmpty()) {
			long key = list.get(0);
			list.remove(0);
			long value = mul.get(key);
			for(long i = 0; i < value; i++) {
				multi = multi.multiply(new BigInteger(Long.toBinaryString(key)));
			}
		}
		sub = b.divide(multi).subtract(a.divide(multi));
		if(a.mod(multi).toString() == "0") {
			sub = sub.add(new BigInteger("1"));
		}
		ans.add(sub);
		System.out.println(ans.toString());
	}

}