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 Go (1.6) (judge verdict: Wrong Answer)

package main

import (
	"fmt"
	"math"
)

func ceil(a, b int) int {
	return int(math.Ceil(float64(a) / float64(b)))
}

func gcd(a, b int) int {
	if b == 0 {
		return a
	}
	return gcd(b, a%b)
}

func lcm(a, b int) int {
	return a * b / gcd(a, b)
}

func main() {
	var A, B, C, D int
	fmt.Scan(&A, &B, &C, &D)

	ba := B - A + 1

	var bac int
	if A%C == 0 {
		bac = ceil(ba, C)
	} else if ba-C+A%C > 0 {
		bac = ceil(ba-C+A%C, C)
	}
	var bad int
	if A%D == 0 {
		bad = ceil(ba, D)
	} else if ba-D+A%D > 0 {
		bad = ceil(ba-D+A%D, D)
	}
	var bacd int
	cd := lcm(C, D)
	if A%cd == 0 {
		bacd = ceil(ba, cd)
	} else if ba-cd+A%cd > 0 {
		bacd = ceil(ba-cd+A%cd, cd)
	}

	ans := ba - (bac + bad - bacd)
	fmt.Println(ans)
}