import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
	    Scanner scanner = new Scanner(System.in);

	    long A=Long.parseLong(scanner.next());
	    long B=Long.parseLong(scanner.next());
	    long C=Long.parseLong(scanner.next());
	    long D=Long.parseLong(scanner.next());

	    long ax= Math.floorDiv(A,C);
	    long bx= Math.floorDiv(B,C);
	    long ay= Math.floorDiv(A,D);
	    long by= Math.floorDiv(B,D);

	    long cd = C * D / f(C, D);
        long az=Math.floorDiv(A,cd);
        long bz=Math.floorDiv(B,cd);

        long ac= A-ax-ay+az;
        long bc= B-bx-by+bz;
        long c=bc-ac;
        if ((A%C)!=0 && (A%D)!=0)c++;
	    System.out.println(c);

	}

	public static long f(long m, long n) {
		if (m<n) {
			m^=n;
			n^=m;
			m^=n;
		}

		while(true) {
			long t=m%n;
			if (t==0) {
				return n;
			} else {
				m=n;
				n=t;
			}
		}
	}
} import java.util.Scanner; Scanner java.util public class Main {

	public static void main(String[] args) {
	    Scanner scanner = new Scanner(System.in);

	    long A=Long.parseLong(scanner.next());
	    long B=Long.parseLong(scanner.next());
	    long C=Long.parseLong(scanner.next());
	    long D=Long.parseLong(scanner.next());

	    long ax= Math.floorDiv(A,C);
	    long bx= Math.floorDiv(B,C);
	    long ay= Math.floorDiv(A,D);
	    long by= Math.floorDiv(B,D);

	    long cd = C * D / f(C, D);
        long az=Math.floorDiv(A,cd);
        long bz=Math.floorDiv(B,cd);

        long ac= A-ax-ay+az;
        long bc= B-bx-by+bz;
        long c=bc-ac;
        if ((A%C)!=0 && (A%D)!=0)c++;
	    System.out.println(c);

	}

	public static long f(long m, long n) {
		if (m<n) {
			m^=n;
			n^=m;
			m^=n;
		}

		while(true) {
			long t=m%n;
			if (t==0) {
				return n;
			} else {
				m=n;
				n=t;
			}
		}
	}
} Main public static void main(String[] args) {
	    Scanner scanner = new Scanner(System.in);

	    long A=Long.parseLong(scanner.next());
	    long B=Long.parseLong(scanner.next());
	    long C=Long.parseLong(scanner.next());
	    long D=Long.parseLong(scanner.next());

	    long ax= Math.floorDiv(A,C);
	    long bx= Math.floorDiv(B,C);
	    long ay= Math.floorDiv(A,D);
	    long by= Math.floorDiv(B,D);

	    long cd = C * D / f(C, D);
        long az=Math.floorDiv(A,cd);
        long bz=Math.floorDiv(B,cd);

        long ac= A-ax-ay+az;
        long bc= B-bx-by+bz;
        long c=bc-ac;
        if ((A%C)!=0 && (A%D)!=0)c++;
	    System.out.println(c);

	} main {
	    Scanner scanner = new Scanner(System.in);

	    long A=Long.parseLong(scanner.next());
	    long B=Long.parseLong(scanner.next());
	    long C=Long.parseLong(scanner.next());
	    long D=Long.parseLong(scanner.next());

	    long ax= Math.floorDiv(A,C);
	    long bx= Math.floorDiv(B,C);
	    long ay= Math.floorDiv(A,D);
	    long by= Math.floorDiv(B,D);

	    long cd = C * D / f(C, D);
        long az=Math.floorDiv(A,cd);
        long bz=Math.floorDiv(B,cd);

        long ac= A-ax-ay+az;
        long bc= B-bx-by+bz;
        long c=bc-ac;
        if ((A%C)!=0 && (A%D)!=0)c++;
	    System.out.println(c);

	} Scanner scanner = new Scanner(System.in); scanner new Scanner(System.in) long A=Long.parseLong(scanner.next()); A Long.parseLong(scanner.next()) Long.parseLong Long scanner.next() scanner.next scanner long B=Long.parseLong(scanner.next()); B Long.parseLong(scanner.next()) Long.parseLong Long scanner.next() scanner.next scanner long C=Long.parseLong(scanner.next()); C Long.parseLong(scanner.next()) Long.parseLong Long scanner.next() scanner.next scanner long D=Long.parseLong(scanner.next()); D Long.parseLong(scanner.next()) Long.parseLong Long scanner.next() scanner.next scanner long ax= Math.floorDiv(A,C); ax Math.floorDiv(A,C) Math.floorDiv Math A C long bx= Math.floorDiv(B,C); bx Math.floorDiv(B,C) Math.floorDiv Math B C long ay= Math.floorDiv(A,D); ay Math.floorDiv(A,D) Math.floorDiv Math A D long by= Math.floorDiv(B,D); by Math.floorDiv(B,D) Math.floorDiv Math B D long cd = C * D / f(C, D); cd C * D / f(C, D) C * D C D f(C, D) f C D long az=Math.floorDiv(A,cd); az Math.floorDiv(A,cd) Math.floorDiv Math A cd long bz=Math.floorDiv(B,cd); bz Math.floorDiv(B,cd) Math.floorDiv Math B cd long ac= A-ax-ay+az; ac A-ax-ay+az A-ax-ay A-ax-ay A ax ay az long bc= B-bx-by+bz; bc B-bx-by+bz B-bx-by B-bx-by B bx by bz long c=bc-ac; c bc-ac bc ac if ((A%C)!=0 && (A%D)!=0)c++; (A%C)!=0 && (A%D)!=0 (A%C)!=0 (A%C) A C 0 (A%D)!=0 (A%D) A D 0 c++ c System.out.println(c) System.out.println System.out System System.out c String[] args args public static long f(long m, long n) {
		if (m<n) {
			m^=n;
			n^=m;
			m^=n;
		}

		while(true) {
			long t=m%n;
			if (t==0) {
				return n;
			} else {
				m=n;
				n=t;
			}
		}
	} f {
		if (m<n) {
			m^=n;
			n^=m;
			m^=n;
		}

		while(true) {
			long t=m%n;
			if (t==0) {
				return n;
			} else {
				m=n;
				n=t;
			}
		}
	} if (m<n) {
			m^=n;
			n^=m;
			m^=n;
		} m<n m n {
			m^=n;
			n^=m;
			m^=n;
		} m^=n m n n^=m n m m^=n m n while(true) {
			long t=m%n;
			if (t==0) {
				return n;
			} else {
				m=n;
				n=t;
			}
		} true {
			long t=m%n;
			if (t==0) {
				return n;
			} else {
				m=n;
				n=t;
			}
		} long t=m%n; t m%n m n if (t==0) {
				return n;
			} else {
				m=n;
				n=t;
			} t==0 t 0 {
				return n;
			} return n; n {
				m=n;
				n=t;
			} m=n m n n=t n t long m m long n n public class Main {

	public static void main(String[] args) {
	    Scanner scanner = new Scanner(System.in);

	    long A=Long.parseLong(scanner.next());
	    long B=Long.parseLong(scanner.next());
	    long C=Long.parseLong(scanner.next());
	    long D=Long.parseLong(scanner.next());

	    long ax= Math.floorDiv(A,C);
	    long bx= Math.floorDiv(B,C);
	    long ay= Math.floorDiv(A,D);
	    long by= Math.floorDiv(B,D);

	    long cd = C * D / f(C, D);
        long az=Math.floorDiv(A,cd);
        long bz=Math.floorDiv(B,cd);

        long ac= A-ax-ay+az;
        long bc= B-bx-by+bz;
        long c=bc-ac;
        if ((A%C)!=0 && (A%D)!=0)c++;
	    System.out.println(c);

	}

	public static long f(long m, long n) {
		if (m<n) {
			m^=n;
			n^=m;
			m^=n;
		}

		while(true) {
			long t=m%n;
			if (t==0) {
				return n;
			} else {
				m=n;
				n=t;
			}
		}
	}
} public class Main {

	public static void main(String[] args) {
	    Scanner scanner = new Scanner(System.in);

	    long A=Long.parseLong(scanner.next());
	    long B=Long.parseLong(scanner.next());
	    long C=Long.parseLong(scanner.next());
	    long D=Long.parseLong(scanner.next());

	    long ax= Math.floorDiv(A,C);
	    long bx= Math.floorDiv(B,C);
	    long ay= Math.floorDiv(A,D);
	    long by= Math.floorDiv(B,D);

	    long cd = C * D / f(C, D);
        long az=Math.floorDiv(A,cd);
        long bz=Math.floorDiv(B,cd);

        long ac= A-ax-ay+az;
        long bc= B-bx-by+bz;
        long c=bc-ac;
        if ((A%C)!=0 && (A%D)!=0)c++;
	    System.out.println(c);

	}

	public static long f(long m, long n) {
		if (m<n) {
			m^=n;
			n^=m;
			m^=n;
		}

		while(true) {
			long t=m%n;
			if (t==0) {
				return n;
			} else {
				m=n;
				n=t;
			}
		}
	}
} Main
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
	    Scanner scanner = new Scanner(System.in);

	    long A=Long.parseLong(scanner.next());
	    long B=Long.parseLong(scanner.next());
	    long C=Long.parseLong(scanner.next());
	    long D=Long.parseLong(scanner.next());

	    long ax= Math.floorDiv(A,C);
	    long bx= Math.floorDiv(B,C);
	    long ay= Math.floorDiv(A,D);
	    long by= Math.floorDiv(B,D);

	    long cd = C * D / f(C, D);
        long az=Math.floorDiv(A,cd);
        long bz=Math.floorDiv(B,cd);

        long ac= A-ax-ay+az;
        long bc= B-bx-by+bz;
        long c=bc-ac;
        if ((A%C)!=0 && (A%D)!=0)c++;
	    System.out.println(c);

	}

	public static long f(long m, long n) {
		if (m<n) {
			m^=n;
			n^=m;
			m^=n;
		}

		while(true) {
			long t=m%n;
			if (t==0) {
				return n;
			} else {
				m=n;
				n=t;
			}
		}
	}
}