#from statistics import median

#import collections

#aa = collections.Counter(a) # list to list

#from itertools import combinations # (string,3) 3回

#

#

# pythonで無理なときは、pypyでやると正解するかも！！

#

#



mod = 10**9 + 7



def readInts():

  return list(map(int,input().split()))

def main():

    # 全体から、Ｃの倍数 + Ｄの倍数 - (CとDの倍数でもあるやつ)をひけええ

    # C と D の最小公倍数　これは　lcmだね ~ c * d // gcd(c,d)かな

    a,b,c,d = readInts()

    # A 以上　B 以下の中　＝ B以下 - (A-1以下)

    # まず最小公倍数を求めよう

    from fractions import gcd

    lcm = ( c // gcd(c,d) ) * d

    #print(lcm)

    # まず B 以下のやつ





    # 答えは C でも　D でも割り切れないやつだからｗｗｗｗｗｗｗ





    B_ = b - (b // c + b // d - b // lcm)

    #print(B_)

    # んで A-1以下のやつ

    A_ = a-1 - ((a-1) // c  + (a-1) // d - (a-1) // lcm) # 足すな　引け

    # んで答え

    print((B_ - A_))

if __name__ == '__main__':

  main()

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

from fractions import gcd

a -= 1

nya = c//gcd(c,d) * d # 最小公倍数

# オイラー関数

ca = a//c

da = a//d

#print(ca,da)

cda = ca + da - a//nya

ans_a = a - cda

cb = b//c

db = b//d

#print("cddb",cb,db)

cdb = cb + db - b//nya

ans_b = b - cdb

print((ans_b - ans_a))

#print(ans_a,ans_b)

#print(nya)

#ans = ans_b - ans_a

#print(ans)

# from statistics import median
# import collections
# aa = collections.Counter(a) # list to list
# from itertools import combinations # (string,3) 3回
#
#
# pythonで無理なときは、pypyでやると正解するかも！！
#
#
mod = 10**9 + 7


def readInts():
    return list(map(int, input().split()))


def main():
    # 全体から、Ｃの倍数 + Ｄの倍数 - (CとDの倍数でもあるやつ)をひけええ
    # C と D の最小公倍数　これは　lcmだね ~ c * d // gcd(c,d)かな
    a, b, c, d = readInts()
    # A 以上　B 以下の中　＝ B以下 - (A-1以下)
    # まず最小公倍数を求めよう
    from fractions import gcd

    lcm = (c // gcd(c, d)) * d
    # print(lcm)
    # まず B 以下のやつ
    # 答えは C でも　D でも割り切れないやつだからｗｗｗｗｗｗｗ
    B_ = b - (b // c + b // d - b // lcm)
    # print(B_)
    # んで A-1以下のやつ
    A_ = a - 1 - ((a - 1) // c + (a - 1) // d - (a - 1) // lcm)  # 足すな　引け
    # んで答え
    print((B_ - A_))


if __name__ == "__main__":
    main()

a, b, c, d = list(map(int, input().split()))
from fractions import gcd

a -= 1
nya = c // gcd(c, d) * d  # 最小公倍数
# オイラー関数
ca = a // c
da = a // d
# print(ca,da)
cda = ca + da - a // nya
ans_a = a - cda
cb = b // c
db = b // d
# print("cddb",cb,db)
cdb = cb + db - b // nya
ans_b = b - cdb
print((ans_b - ans_a))
# print(ans_a,ans_b)
# print(nya)
# ans = ans_b - ans_a
# print(ans)

-# from statistics import median -# import collections -# aa = collections.Counter(a) # list to list -# from itertools import combinations # (string,3) 3回 -# -# -# pythonで無理なときは、pypyでやると正解するかも！！ -# -# -mod = 10**9 + 7 +a, b, c, d = list(map(int, input().split())) +from fractions import gcd - -def readInts(): -    return list(map(int, input().split())) - - -def main(): -    # 全体から、Ｃの倍数 + Ｄの倍数 - (CとDの倍数でもあるやつ)をひけええ -    # C と D の最小公倍数　これは　lcmだね ~ c * d // gcd(c,d)かな -    a, b, c, d = readInts() -    # A 以上　B 以下の中　＝ B以下 - (A-1以下) -    # まず最小公倍数を求めよう -    from fractions import gcd - -    lcm = (c // gcd(c, d)) * d -    # print(lcm) -    # まず B 以下のやつ -    # 答えは C でも　D でも割り切れないやつだからｗｗｗｗｗｗｗ -    B_ = b - (b // c + b // d - b // lcm) -    # print(B_) -    # んで A-1以下のやつ -    A_ = a - 1 - ((a - 1) // c + (a - 1) // d - (a - 1) // lcm)  # 足すな　引け -    # んで答え -    print((B_ - A_)) - - -if __name__ == "__main__": -    main() +a -= 1 +nya = c // gcd(c, d) * d  # 最小公倍数 +# オイラー関数 +ca = a // c +da = a // d +# print(ca,da) +cda = ca + da - a // nya +ans_a = a - cda +cb = b // c +db = b // d +# print("cddb",cb,db) +cdb = cb + db - b // nya +ans_b = b - cdb +print((ans_b - ans_a)) +# print(ans_a,ans_b) +# print(nya) +# ans = ans_b - ans_a +# print(ans)