This problem is about binary search. this problem is kind of hard if you don't have knowledge of binary search. If you do, one thing still noising is that how you think about the two sets of presents numbers. For the first friend, you should give at least those numbers the 2nd don't like minus they both don't like. the same thing goes with the 2nd friend. And then you need to check is it enough for both of your friend. if not, give them the safe number for both of them. you also need to check whether these safe number is enough for them.
the source code is as follows:
def check(v):
f1 = v/x
f2 = v/y
bo = v/(x*y)
lt = v - f1 - f2 + bo
c1 = a - (f2 - bo)
c2 = b - (f1 - bo)
if c1 > 0:
lt -= c1
if lt < 0:
return False
if c2 > 0:
lt -= c2
if lt < 0:
return False
return True
a, b, x, y = map(int, raw_input().split())
l = int(a + b)
h = 1e20
while l < h:
v = (l + h)//2
if check(v):
h = v
else :
l = v + 1
print int(l - 1)