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 Haskell (GHC 7.10.3) (judge verdict: Accepted)

module Main where
import qualified Control.Monad as C
import qualified Data.Char as C
import qualified Data.List as L
import qualified Data.Map as M
import qualified Data.Array as A

int = read :: String -> Integer
getWord :: IO String
getWord = do
  c <- getChar
  if C.isSpace c
  then
    return []
  else do
    ws <- getWord
    return (c:ws)
getInt = fmap int getWord
replace pred a = map (\x -> if pred x then a else x)

main = interact $ printer . solver . parser
parser = map int . words
printer = unlines . (:[]) . show

solver (a:b:c:d:ss) = result -- [uc,cc,dc,cdc,result]
  where
    result = uc - cc - dc + cdc

    uc = b - a + 1

    cc =
      if a <= (b`div`c)*c && (b`div`c)*c <= b
      then
        b `div` c + 1 -
        (a `div` c + if a `mod` c == 0 then 0 else 1)
      else
        0

    dc = 
      if a <= (b`div`d)*d && (b`div`d)*d <= b
      then
        b `div` d + 1 -
        (a `div` d + if a `mod` d == 0 then 0 else 1)
      else
        0

    cd = c `div` ( gcd c d ) * d
    cdc = 
      if a <= (b`div`cd)*cd && (b`div`cd)*cd <= b
      then
        b `div` cd + 1 -
        (a `div` cd + if a `mod` cd == 0 then 0 else 1)
      else
        0