import java.io.PrintStream;
import java.util.Scanner;

public class Main {
	static final PrintStream out = System.out;
	static Scanner sc = new Scanner(System.in);
	static final long Mod = 1000_000_007L;
	public static void main(String[] args) {
		Main main = new Main();
		main.solve();
		System.exit(0);
	}

	void solve() {
		long A = nextLong();
		long B = nextLong();
		int  C = nextInt();
		int  D = nextInt();

		long Anum=0,Bnum=0;

		//lcm
		long lcm = C/gcd(C,D)*D;
		A--;
		Anum = A - A/C - A/D + A/lcm;
		Bnum = B - B/C - B/D + B/lcm;

		out.println(Bnum-Anum);
	}

	public int[] nextIntArray(int n) {
		int[] a = new int[n];
		for (int i = 0; i < n; i++)a[i] = nextInt();
		return a;
	}
	public long[] nextLongArray(int n) {
		long[] a = new long[n];
		for (int i = 0; i < n; i++)a[i] = nextLong();
		return a;
	}
	public int nextInt() {
		return Integer.parseInt(next());
	}
	public long nextLong() {
		return Long.parseLong(next());
	}
	public String next() {
		return sc.next();
	}

	long gcd(long m,long n) {
		if (m<n) return gcd(n,m);
		if (n==0)return m;
		return gcd(n,m%n);
	}

} import java.io.PrintStream; PrintStream java.io import java.util.Scanner; Scanner java.util public class Main {
	static final PrintStream out = System.out;
	static Scanner sc = new Scanner(System.in);
	static final long Mod = 1000_000_007L;
	public static void main(String[] args) {
		Main main = new Main();
		main.solve();
		System.exit(0);
	}

	void solve() {
		long A = nextLong();
		long B = nextLong();
		int  C = nextInt();
		int  D = nextInt();

		long Anum=0,Bnum=0;

		//lcm
		long lcm = C/gcd(C,D)*D;
		A--;
		Anum = A - A/C - A/D + A/lcm;
		Bnum = B - B/C - B/D + B/lcm;

		out.println(Bnum-Anum);
	}

	public int[] nextIntArray(int n) {
		int[] a = new int[n];
		for (int i = 0; i < n; i++)a[i] = nextInt();
		return a;
	}
	public long[] nextLongArray(int n) {
		long[] a = new long[n];
		for (int i = 0; i < n; i++)a[i] = nextLong();
		return a;
	}
	public int nextInt() {
		return Integer.parseInt(next());
	}
	public long nextLong() {
		return Long.parseLong(next());
	}
	public String next() {
		return sc.next();
	}

	long gcd(long m,long n) {
		if (m<n) return gcd(n,m);
		if (n==0)return m;
		return gcd(n,m%n);
	}

} Main static final PrintStream out = System.out; out System.out System System.out static Scanner sc = new Scanner(System.in); sc new Scanner(System.in) static final long Mod = 1000_000_007L; Mod 1000_000_007L public static void main(String[] args) {
		Main main = new Main();
		main.solve();
		System.exit(0);
	} main {
		Main main = new Main();
		main.solve();
		System.exit(0);
	} Main main = new Main(); main new Main() main.solve() main.solve main System.exit(0) System.exit System 0 String[] args args void solve() {
		long A = nextLong();
		long B = nextLong();
		int  C = nextInt();
		int  D = nextInt();

		long Anum=0,Bnum=0;

		//lcm
		long lcm = C/gcd(C,D)*D;
		A--;
		Anum = A - A/C - A/D + A/lcm;
		Bnum = B - B/C - B/D + B/lcm;

		out.println(Bnum-Anum);
	} solve {
		long A = nextLong();
		long B = nextLong();
		int  C = nextInt();
		int  D = nextInt();

		long Anum=0,Bnum=0;

		//lcm
		long lcm = C/gcd(C,D)*D;
		A--;
		Anum = A - A/C - A/D + A/lcm;
		Bnum = B - B/C - B/D + B/lcm;

		out.println(Bnum-Anum);
	} long A = nextLong(); A nextLong() nextLong long B = nextLong(); B nextLong() nextLong int  C = nextInt(); C nextInt() nextInt int  D = nextInt(); D nextInt() nextInt long Anum=0 Anum 0 Bnum=0; Bnum 0 long lcm = C/gcd(C,D)*D; lcm C/gcd(C,D)*D C/gcd(C,D) C gcd(C,D) gcd C D D A-- A Anum = A - A/C - A/D + A/lcm Anum A - A/C - A/D + A/lcm A - A/C - A/D A - A/C - A/D A A/C A C A/D A D A/lcm A lcm Bnum = B - B/C - B/D + B/lcm Bnum B - B/C - B/D + B/lcm B - B/C - B/D B - B/C - B/D B B/C B C B/D B D B/lcm B lcm out.println(Bnum-Anum) out.println out Bnum-Anum Bnum Anum public int[] nextIntArray(int n) {
		int[] a = new int[n];
		for (int i = 0; i < n; i++)a[i] = nextInt();
		return a;
	} nextIntArray {
		int[] a = new int[n];
		for (int i = 0; i < n; i++)a[i] = nextInt();
		return a;
	} int[] a = new int[n]; a new int[n] n for (int i = 0; i < n; i++)a[i] = nextInt(); int i = 0; int i = 0; i 0 i < n i n i++ i++ i a[i] = nextInt(); a[i] = nextInt() a[i] a i nextInt() nextInt return a; a int n n public long[] nextLongArray(int n) {
		long[] a = new long[n];
		for (int i = 0; i < n; i++)a[i] = nextLong();
		return a;
	} nextLongArray {
		long[] a = new long[n];
		for (int i = 0; i < n; i++)a[i] = nextLong();
		return a;
	} long[] a = new long[n]; a new long[n] n for (int i = 0; i < n; i++)a[i] = nextLong(); int i = 0; int i = 0; i 0 i < n i n i++ i++ i a[i] = nextLong(); a[i] = nextLong() a[i] a i nextLong() nextLong return a; a int n n public int nextInt() {
		return Integer.parseInt(next());
	} nextInt {
		return Integer.parseInt(next());
	} return Integer.parseInt(next()); Integer.parseInt(next()) Integer.parseInt Integer next() next public long nextLong() {
		return Long.parseLong(next());
	} nextLong {
		return Long.parseLong(next());
	} return Long.parseLong(next()); Long.parseLong(next()) Long.parseLong Long next() next public String next() {
		return sc.next();
	} next {
		return sc.next();
	} return sc.next(); sc.next() sc.next sc long gcd(long m,long n) {
		if (m<n) return gcd(n,m);
		if (n==0)return m;
		return gcd(n,m%n);
	} gcd {
		if (m<n) return gcd(n,m);
		if (n==0)return m;
		return gcd(n,m%n);
	} if (m<n) return gcd(n,m); m<n m n return gcd(n,m); gcd(n,m) gcd n m if (n==0)return m; n==0 n 0 return m; m return gcd(n,m%n); gcd(n,m%n) gcd n m%n m n long m m long n n public class Main {
	static final PrintStream out = System.out;
	static Scanner sc = new Scanner(System.in);
	static final long Mod = 1000_000_007L;
	public static void main(String[] args) {
		Main main = new Main();
		main.solve();
		System.exit(0);
	}

	void solve() {
		long A = nextLong();
		long B = nextLong();
		int  C = nextInt();
		int  D = nextInt();

		long Anum=0,Bnum=0;

		//lcm
		long lcm = C/gcd(C,D)*D;
		A--;
		Anum = A - A/C - A/D + A/lcm;
		Bnum = B - B/C - B/D + B/lcm;

		out.println(Bnum-Anum);
	}

	public int[] nextIntArray(int n) {
		int[] a = new int[n];
		for (int i = 0; i < n; i++)a[i] = nextInt();
		return a;
	}
	public long[] nextLongArray(int n) {
		long[] a = new long[n];
		for (int i = 0; i < n; i++)a[i] = nextLong();
		return a;
	}
	public int nextInt() {
		return Integer.parseInt(next());
	}
	public long nextLong() {
		return Long.parseLong(next());
	}
	public String next() {
		return sc.next();
	}

	long gcd(long m,long n) {
		if (m<n) return gcd(n,m);
		if (n==0)return m;
		return gcd(n,m%n);
	}

} public class Main {
	static final PrintStream out = System.out;
	static Scanner sc = new Scanner(System.in);
	static final long Mod = 1000_000_007L;
	public static void main(String[] args) {
		Main main = new Main();
		main.solve();
		System.exit(0);
	}

	void solve() {
		long A = nextLong();
		long B = nextLong();
		int  C = nextInt();
		int  D = nextInt();

		long Anum=0,Bnum=0;

		//lcm
		long lcm = C/gcd(C,D)*D;
		A--;
		Anum = A - A/C - A/D + A/lcm;
		Bnum = B - B/C - B/D + B/lcm;

		out.println(Bnum-Anum);
	}

	public int[] nextIntArray(int n) {
		int[] a = new int[n];
		for (int i = 0; i < n; i++)a[i] = nextInt();
		return a;
	}
	public long[] nextLongArray(int n) {
		long[] a = new long[n];
		for (int i = 0; i < n; i++)a[i] = nextLong();
		return a;
	}
	public int nextInt() {
		return Integer.parseInt(next());
	}
	public long nextLong() {
		return Long.parseLong(next());
	}
	public String next() {
		return sc.next();
	}

	long gcd(long m,long n) {
		if (m<n) return gcd(n,m);
		if (n==0)return m;
		return gcd(n,m%n);
	}

} Main
import java.io.PrintStream;
import java.util.Scanner;

public class Main {
	static final PrintStream out = System.out;
	static Scanner sc = new Scanner(System.in);
	static final long Mod = 1000_000_007L;
	public static void main(String[] args) {
		Main main = new Main();
		main.solve();
		System.exit(0);
	}

	void solve() {
		long A = nextLong();
		long B = nextLong();
		int  C = nextInt();
		int  D = nextInt();

		long Anum=0,Bnum=0;

		//lcm
		long lcm = C/gcd(C,D)*D;
		A--;
		Anum = A - A/C - A/D + A/lcm;
		Bnum = B - B/C - B/D + B/lcm;

		out.println(Bnum-Anum);
	}

	public int[] nextIntArray(int n) {
		int[] a = new int[n];
		for (int i = 0; i < n; i++)a[i] = nextInt();
		return a;
	}
	public long[] nextLongArray(int n) {
		long[] a = new long[n];
		for (int i = 0; i < n; i++)a[i] = nextLong();
		return a;
	}
	public int nextInt() {
		return Integer.parseInt(next());
	}
	public long nextLong() {
		return Long.parseLong(next());
	}
	public String next() {
		return sc.next();
	}

	long gcd(long m,long n) {
		if (m<n) return gcd(n,m);
		if (n==0)return m;
		return gcd(n,m%n);
	}

}