#include <bits/stdc++.h>
using namespace std;
bool predicado(long long valor, long long cnt1, long long cnt2, long long x,
               long long y) {
  long long numsPos1, numsPos2, numsPosCompartidos;
  numsPos1 = valor;
  numsPos2 = valor;
  numsPosCompartidos = valor;
  numsPos1 -= valor / x;
  numsPos2 -= valor / y;
  numsPosCompartidos += valor / x / y;
  numsPosCompartidos -= valor / x;
  numsPosCompartidos -= valor / y;
  if (numsPos1 >= cnt1 && numsPos2 >= cnt2 &&
      numsPos1 + numsPos2 - numsPosCompartidos >= cnt1 + cnt2) {
    return true;
  }
  return false;
}
int main() {
  long long cnt1, cnt2, x, y;
  cin >> cnt1 >> cnt2 >> x >> y;
  long long poloSur, poloNorte, medio;
  poloSur = 1;
  poloNorte = 1000000000000;
  medio = poloSur + (poloNorte - poloSur) * 0.5;
  while (!(predicado(medio, cnt1, cnt2, x, y) &&
           !predicado(medio - 1, cnt1, cnt2, x, y))) {
    if (predicado(medio, cnt1, cnt2, x, y)) {
      poloNorte = medio;
    } else {
      poloSur = medio;
    }
    medio = poloSur + (poloNorte - poloSur) * 0.5;
  }
  cout << medio;
  return 0;
}
