#include<bits/stdc++.h>
using namespace std;
#define ff                first
#define brn                "\n"
#define ss                second
#define mk                make_pair
#define int               long long
#define pb                push_back
#define pf                push_front
#define ps(x,y)           fixed<<setprecision(y)<<x
#define w(x)              int x; cin>>x; while(x--)
#define FOR(i,a,b)        for(int i=(a);i<(b);i++)
#define ROF(i,a,b)        for(int i=(a);i>=(b);i--)
#define so(a,n)           sort(a,a+n)
#define rso(a,n)          sort(a,a+n),reverse(a,a+n)
#define all(v)            (v).begin(),(v).end()
#define ps(x,y)           fixed<<setprecision(y)<<x
#define sz                size();
#define p_sieve           10000007
const int                 maxn = 1e3 + 5;
const int                 modulo = 1000000007;
#define mod               1000000009;
const double              pi = 3.14159;
#define INF               1000001000
#define imx                9999999999999999
#define imi               -9999999999999999
template<class T> ostream& operator <<(ostream &out, vector<T> &A) {for (auto x : A) out << x << " "; return out;}
template<class T> ostream& operator <<(ostream &out, set<T> &A) {for (auto x : A) out << x << " "; return out;}
template<class T> ostream& operator <<(ostream &out, unordered_set<T> &A) {for (auto x : A) out << x << " "; return out;}

//check n==1 and base cases//
//********************************---------always check array boundness-----------****************
// factorial ncr
// int printNcR(int n, int r)
// {
// 	if (n < r)return 0;
// 	long long p = 1, k = 1;
// 	if (n - r < r)
// 		r = n - r;
// 	if (r != 0) {
// 		while (r) {
// 			p *= n;
// 			k *= r;
// 			long long m = __gcd(p, k);
// 			p /= m;
// 			k /= m;

// 			n--;
// 			r--;
// 		}
// 	}
// 	else p = 1;
// 	return p;
// }

// int power(int x, unsigned int y)
// {
// 	int res = 1;
// 	//x = x % modulo;
// 	if (x == 0) return 0;
// 	while (y > 0)
// 	{
// 		if (y & 1) res = (res * x);
// 		y = y >> 1;
// 		x = (x * x);
// 	}

// 	return res;
// }
// const int N = 1e4 + 5;
// int dp[N];
// bool prime[N];
// std::vector<int> v;


// bool prime[N];
// void precompute()
// {
// 	memset(prime , 1, sizeof(prime));
// 	prime[0] = 0;
// 	prime[1] = 0;
// 	for (int i = 2; i * i <= N; i++)
// 	{
// 		if (prime[i] == 1)
// 			for (int j = i * i; j <= N; j += i )prime[j] = 0;
// 	}
// }

// generating subsets..
// for ( int i = 0 ; i < ( 1 << m ) ; ++ i )
// {
// 	for ( int j = 0; j < m ; ++ j )
// 	{
// 		if ( ( i & ( 1 << j ) ) != 0)
// 		{

// 		}
// 	}
// }
// int msb(unsigned a) {
// 	return __lg(a ^ (a & (a - 1)));
// }
int mceil(int a, int b)
{
	if (a % b == 0)return a / b;
	else return a / b + 1;
}
// const int N = 2e5 + 5;
// std::vector<int> v[N];
// 3 2 1 4 5

// bipartiteness
// const int N = 1e5 + 5;
// int col[N];
// int vis[N];
// int possible = 0;
// std::vector<int> v[N];
// void dfs(int n, int c)
// {
// 	if (vis[n] == 1)return;
// 	vis[n] = 1;
// 	col[n] = c;
// 	for (auto i : v[n])
// 	{
// 		if (vis[i] == 0)dfs(i, c ^ 1);
// 		else
// 		{
// 			if (c == col[i])
// 			{
// 				possible = -1;
// 				return;
// 			}
// 		}
// 	}
// }

// string decimalToBinary(int n)
// {
// 	string s = bitset<64> (n).to_string();
// 	const auto loc1 = s.find('1');

// 	if (loc1 != string::npos)
// 		return s.substr(loc1);
// 	return "0";
// }
// int cal(int n, int m)
// {
// 	if (n % m == 0)return n / m + 1;
// 	else return n / m;
// }
// struct Person
// {
// 	int A;
// 	int B;
// 	int C;
// };
// bool cmp(Person a, Person b)
// {
// 	return a.A < b.A;
// }
void solve()
{
	int cnt1, cnt2, x, y; cin >> cnt1 >> cnt2 >> x >> y;
	if (cnt1 + cnt2 < x * y / (__gcd(x, y)))
	{
		int ans = (x * y) / __gcd(x, y) - 1;
		if (cnt1 > cnt2)
		{
			while (ans % x != 0 and ans >= (cnt2 + cnt1))ans--;
			cout << ans + 1;
		}
		else if (cnt1 < cnt2)
		{
			while (ans % y != 0 and ans >= (cnt2 + cnt1))ans--;
			cout << ans + 1;
		}
	}
	else {

		int lcm = x * y / (__gcd(x, y));
		int ans = (cnt2 + cnt1) + ((cnt2 + cnt1) / (lcm));
		cout << ans;
	}
}
int32_t main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	//precompute();
	//w(t)
	solve();
}