""" import math





def lcm(x, y):

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





A, B, C, D = map(int, input().split())



# A以上B以下でCで割り切れる数の個数

x1 = (A-1) // C

x2 = B // C

x = x2 - x1

#print("x:", x)



# A以上B以下でDで割り切れる数の個数

y1 = (A-1) // D

y2 = B // D

y = y2 - y1

#print("y", y)



# A以上B以下でC,Dで割り切れる数の個数

z1 = (A-1) // lcm(C, D)

z2 = B // lcm(C, D)

z = z2 - z1

#print("lcm:{}".format(lcm(C, D)))

#print("z", z)



# A~B間の整数 - Cの倍数とDの倍数の個数 + CでもDでも割り切れる個数

not_d = B - (A+1) - (x + y - z)

print(int(not_d))

 """



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



total = b - a + 1





def lem(A, B):

	AB = A * B

	while B != 0:

		A, B = B, A % B

	return AB // A





bsep = (b // c) + (b // d) - (b // lem(c, d))

asep = (a-1) // c + (a-1) // d - (a-1) // lem(c, d)



ans = total - bsep + asep

print(ans)

import math





def lem(A, B):

    AB = A * B

    while B != 0:

        A, B = B, A % B

    return AB // A





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



"""

# A以上B以下でCで割り切れる数の個数

x1 = (A-1) // C

x2 = B // C

x = x2 - x1

#print("x:", x)



# A以上B以下でDで割り切れる数の個数

y1 = (A-1) // D

y2 = B // D

y = y2 - y1

#print("y", y)



# A以上B以下でC,Dで割り切れる数の個数

z1 = (A-1) // lcm(C, D)

z2 = B // lcm(C, D)

z = z2 - z1

#print("lcm:{}".format(lcm(C, D)))

#print("z", z)



# A~B間の整数 - Cの倍数とDの倍数の個数 + CでもDでも割り切れる個数

not_d = B - (A+1) - (x + y - z)

print(int(not_d))

 """



total = b - a+1

bsep = (b // c) + (b // d) - (b // lem(c, d))

asep = (a-1) // c + (a-1) // d - (a-1) // lem(c, d)



ans = total - bsep + asep

print(ans)

""" import math
def lcm(x, y):
    return (x * y) // math.gcd(x, y)
A, B, C, D = map(int, input().split())
# A以上B以下でCで割り切れる数の個数
x1 = (A-1) // C
x2 = B // C
x = x2 - x1
#print("x:", x)
# A以上B以下でDで割り切れる数の個数
y1 = (A-1) // D
y2 = B // D
y = y2 - y1
#print("y", y)
# A以上B以下でC,Dで割り切れる数の個数
z1 = (A-1) // lcm(C, D)
z2 = B // lcm(C, D)
z = z2 - z1
#print("lcm:{}".format(lcm(C, D)))
#print("z", z)
# A~B間の整数 - Cの倍数とDの倍数の個数 + CでもDでも割り切れる個数
not_d = B - (A+1) - (x + y - z)
print(int(not_d))
 """
a, b, c, d = list(map(int, input().split()))
total = b - a + 1


def lem(A, B):
    AB = A * B
    while B != 0:
        A, B = B, A % B
    return AB // A


bsep = (b // c) + (b // d) - (b // lem(c, d))
asep = (a - 1) // c + (a - 1) // d - (a - 1) // lem(c, d)
ans = total - bsep + asep
print(ans)

import math


def lem(A, B):
    AB = A * B
    while B != 0:
        A, B = B, A % B
    return AB // A


a, b, c, d = list(map(int, input().split()))
"""
# A以上B以下でCで割り切れる数の個数
x1 = (A-1) // C
x2 = B // C
x = x2 - x1
#print("x:", x)
# A以上B以下でDで割り切れる数の個数
y1 = (A-1) // D
y2 = B // D
y = y2 - y1
#print("y", y)
# A以上B以下でC,Dで割り切れる数の個数
z1 = (A-1) // lcm(C, D)
z2 = B // lcm(C, D)
z = z2 - z1
#print("lcm:{}".format(lcm(C, D)))
#print("z", z)
# A~B間の整数 - Cの倍数とDの倍数の個数 + CでもDでも割り切れる個数
not_d = B - (A+1) - (x + y - z)
print(int(not_d))
 """
total = b - a + 1
bsep = (b // c) + (b // d) - (b // lem(c, d))
asep = (a - 1) // c + (a - 1) // d - (a - 1) // lem(c, d)
ans = total - bsep + asep
print(ans)

-""" import math -def lcm(x, y): -    return (x * y) // math.gcd(x, y) -A, B, C, D = map(int, input().split()) +import math + + +def lem(A, B): +    AB = A * B +    while B != 0: +        A, B = B, A % B +    return AB // A + + +a, b, c, d = list(map(int, input().split())) +""" -a, b, c, d = list(map(int, input().split())) - - -def lem(A, B): -    AB = A * B -    while B != 0: -        A, B = B, A % B -    return AB // A - -