import fractions

a,b,c,d=list(map(int,input().split()))

x1=b//c-(a-1)//c #ｃの割れるやつ

x2=b//d-(a-1)//d #ｄの割れるやつ

sks=c * d // fractions.gcd(c,d)#最小公倍数　普通ならmathメソッドにある

x3=b//sks-(a-1)//sks#ｃ＊ｄの割れるやつ

ans=b-a+1-(x1+x2-x3)

print (ans)

#二回目

import fractions

a,b,c,d=list(map(int,input().split()))

def lcm(x, y):

    return (x * y) // fractions.gcd(x, y)





ans1=b

a-=1

ans2=0

ans1-=b//c

ans1-=b//d



ans1+=b//(lcm(c,d))

#print(ans1)



ans2+=a//c

ans2+=a//d

ans2-=a//(lcm(c,d))

print((ans1-(a-ans2)))
import fractions

a, b, c, d = list(map(int, input().split()))
x1 = b // c - (a - 1) // c  # ｃの割れるやつ
x2 = b // d - (a - 1) // d  # ｄの割れるやつ
sks = c * d // fractions.gcd(c, d)  # 最小公倍数　普通ならmathメソッドにある
x3 = b // sks - (a - 1) // sks  # ｃ＊ｄの割れるやつ
ans = b - a + 1 - (x1 + x2 - x3)
print(ans)

# 二回目
import fractions

a, b, c, d = list(map(int, input().split()))


def lcm(x, y):
    return (x * y) // fractions.gcd(x, y)


ans1 = b
a -= 1
ans2 = 0
ans1 -= b // c
ans1 -= b // d
ans1 += b // (lcm(c, d))
# print(ans1)
ans2 += a // c
ans2 += a // d
ans2 -= a // (lcm(c, d))
print((ans1 - (a - ans2)))

+# 二回目 -x1 = b // c - (a - 1) // c  # ｃの割れるやつ -x2 = b // d - (a - 1) // d  # ｄの割れるやつ -sks = c * d // fractions.gcd(c, d)  # 最小公倍数　普通ならmathメソッドにある -x3 = b // sks - (a - 1) // sks  # ｃ＊ｄの割れるやつ -ans = b - a + 1 - (x1 + x2 - x3) -print(ans) + + +def lcm(x, y): +    return (x * y) // fractions.gcd(x, y) + + +ans1 = b +a -= 1 +ans2 = 0 +ans1 -= b // c +ans1 -= b // d +ans1 += b // (lcm(c, d)) +# print(ans1) +ans2 += a // c +ans2 += a // d +ans2 -= a // (lcm(c, d)) +print((ans1 - (a - ans2)))