fn main() {
    let (big_a, big_b, a, b) = input_tuple::<usize>();

    for x in 0..100_000_000 {
        if x % big_a == a && x % big_b == b {
            println!("{}", x);
            return;
        }
    }
}

fn input_tuple<T>() -> (T, T, T, T)
where
    T: std::str::FromStr,
    <T as std::str::FromStr>::Err: std::fmt::Debug,
{
    let stdin = std::io::stdin();

    let mut buf = String::new();
    stdin.read_line(&mut buf).unwrap();
    buf = buf.trim_end().to_owned();

    let mut iter = buf.split_whitespace();

    let n = iter.next().unwrap().parse().unwrap();
    let m = iter.next().unwrap().parse().unwrap();
    let l = iter.next().unwrap().parse().unwrap();
    let o = iter.next().unwrap().parse().unwrap();

    (n, m, l, o)
}