import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        long a = sc.nextLong();
        long b = sc.nextLong();
        long c = sc.nextLong();
        long d = sc.nextLong();
        sc.close();

        // e: cとdの最大公約数
        long e = gcd2(c, d);
        // f: cとdの最小公倍数
        long f = (c / e) * (d / e) * e;

        // x: cで割り切れる数の個数
        long x = num(a, b, c);
        // y: dで割り切れる数の個数
        long y = num(a, b, d);
        // z: eで割り切れる数の個数
        long z = num(a, b, f);

        // 答え
        long ans = (b - a + 1) - (x + y - z);
        System.out.println(ans);
    }

    static long gcd(long a, long b) {
        if (a == b) {
            return a;
        } else if (a > b) {
            return gcd(b, a - b);
        } else {
            return gcd(a, b - a);
        }
    }

    // a > b
    static long gcd2(long a, long b) {
        if (a % b == 0) {
            return b;
        }
        return gcd2(b, a % b);
    }

    // a: 下限
    // b: 上限
    // c: 割る数
    static long num(long a, long b, long c) {
        long x = (b - a + 1) / c;
        if (((b - a + 1) % c) > (c - (a % c))) {
            x++;
        }
        return x;
    }
} import java.util.Scanner; Scanner java.util public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        long a = sc.nextLong();
        long b = sc.nextLong();
        long c = sc.nextLong();
        long d = sc.nextLong();
        sc.close();

        // e: cとdの最大公約数
        long e = gcd2(c, d);
        // f: cとdの最小公倍数
        long f = (c / e) * (d / e) * e;

        // x: cで割り切れる数の個数
        long x = num(a, b, c);
        // y: dで割り切れる数の個数
        long y = num(a, b, d);
        // z: eで割り切れる数の個数
        long z = num(a, b, f);

        // 答え
        long ans = (b - a + 1) - (x + y - z);
        System.out.println(ans);
    }

    static long gcd(long a, long b) {
        if (a == b) {
            return a;
        } else if (a > b) {
            return gcd(b, a - b);
        } else {
            return gcd(a, b - a);
        }
    }

    // a > b
    static long gcd2(long a, long b) {
        if (a % b == 0) {
            return b;
        }
        return gcd2(b, a % b);
    }

    // a: 下限
    // b: 上限
    // c: 割る数
    static long num(long a, long b, long c) {
        long x = (b - a + 1) / c;
        if (((b - a + 1) % c) > (c - (a % c))) {
            x++;
        }
        return x;
    }
} Main public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        long a = sc.nextLong();
        long b = sc.nextLong();
        long c = sc.nextLong();
        long d = sc.nextLong();
        sc.close();

        // e: cとdの最大公約数
        long e = gcd2(c, d);
        // f: cとdの最小公倍数
        long f = (c / e) * (d / e) * e;

        // x: cで割り切れる数の個数
        long x = num(a, b, c);
        // y: dで割り切れる数の個数
        long y = num(a, b, d);
        // z: eで割り切れる数の個数
        long z = num(a, b, f);

        // 答え
        long ans = (b - a + 1) - (x + y - z);
        System.out.println(ans);
    } main {
        Scanner sc = new Scanner(System.in);
        long a = sc.nextLong();
        long b = sc.nextLong();
        long c = sc.nextLong();
        long d = sc.nextLong();
        sc.close();

        // e: cとdの最大公約数
        long e = gcd2(c, d);
        // f: cとdの最小公倍数
        long f = (c / e) * (d / e) * e;

        // x: cで割り切れる数の個数
        long x = num(a, b, c);
        // y: dで割り切れる数の個数
        long y = num(a, b, d);
        // z: eで割り切れる数の個数
        long z = num(a, b, f);

        // 答え
        long ans = (b - a + 1) - (x + y - z);
        System.out.println(ans);
    } Scanner sc = new Scanner(System.in); sc new Scanner(System.in) long a = sc.nextLong(); a sc.nextLong() sc.nextLong sc long b = sc.nextLong(); b sc.nextLong() sc.nextLong sc long c = sc.nextLong(); c sc.nextLong() sc.nextLong sc long d = sc.nextLong(); d sc.nextLong() sc.nextLong sc sc.close() sc.close sc long e = gcd2(c, d); e gcd2(c, d) gcd2 c d long f = (c / e) * (d / e) * e; f (c / e) * (d / e) * e (c / e) * (d / e) * e (c / e) c e (d / e) d e e long x = num(a, b, c); x num(a, b, c) num a b c long y = num(a, b, d); y num(a, b, d) num a b d long z = num(a, b, f); z num(a, b, f) num a b f long ans = (b - a + 1) - (x + y - z); ans (b - a + 1) - (x + y - z) (b - a + 1) b - a b a 1 (x + y - z) x + y x y z System.out.println(ans) System.out.println System.out System System.out ans String[] args args static long gcd(long a, long b) {
        if (a == b) {
            return a;
        } else if (a > b) {
            return gcd(b, a - b);
        } else {
            return gcd(a, b - a);
        }
    } gcd {
        if (a == b) {
            return a;
        } else if (a > b) {
            return gcd(b, a - b);
        } else {
            return gcd(a, b - a);
        }
    } if (a == b) {
            return a;
        } else if (a > b) {
            return gcd(b, a - b);
        } else {
            return gcd(a, b - a);
        } a == b a b {
            return a;
        } return a; a if (a > b) {
            return gcd(b, a - b);
        } else {
            return gcd(a, b - a);
        } a > b a b {
            return gcd(b, a - b);
        } return gcd(b, a - b); gcd(b, a - b) gcd b a - b a b {
            return gcd(a, b - a);
        } return gcd(a, b - a); gcd(a, b - a) gcd a b - a b a long a a long b b // a > b
    static long gcd2(long a, long b) {
        if (a % b == 0) {
            return b;
        }
        return gcd2(b, a % b);
    } gcd2 {
        if (a % b == 0) {
            return b;
        }
        return gcd2(b, a % b);
    } if (a % b == 0) {
            return b;
        } a % b == 0 a % b a b 0 {
            return b;
        } return b; b return gcd2(b, a % b); gcd2(b, a % b) gcd2 b a % b a b long a a long b b // a: 下限
    // b: 上限
    // c: 割る数
    static long num(long a, long b, long c) {
        long x = (b - a + 1) / c;
        if (((b - a + 1) % c) > (c - (a % c))) {
            x++;
        }
        return x;
    } num {
        long x = (b - a + 1) / c;
        if (((b - a + 1) % c) > (c - (a % c))) {
            x++;
        }
        return x;
    } long x = (b - a + 1) / c; x (b - a + 1) / c (b - a + 1) b - a b a 1 c if (((b - a + 1) % c) > (c - (a % c))) {
            x++;
        } ((b - a + 1) % c) > (c - (a % c)) ((b - a + 1) % c) (b - a + 1) b - a b a 1 c (c - (a % c)) c (a % c) a c {
            x++;
        } x++ x return x; x long a a long b b long c c public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        long a = sc.nextLong();
        long b = sc.nextLong();
        long c = sc.nextLong();
        long d = sc.nextLong();
        sc.close();

        // e: cとdの最大公約数
        long e = gcd2(c, d);
        // f: cとdの最小公倍数
        long f = (c / e) * (d / e) * e;

        // x: cで割り切れる数の個数
        long x = num(a, b, c);
        // y: dで割り切れる数の個数
        long y = num(a, b, d);
        // z: eで割り切れる数の個数
        long z = num(a, b, f);

        // 答え
        long ans = (b - a + 1) - (x + y - z);
        System.out.println(ans);
    }

    static long gcd(long a, long b) {
        if (a == b) {
            return a;
        } else if (a > b) {
            return gcd(b, a - b);
        } else {
            return gcd(a, b - a);
        }
    }

    // a > b
    static long gcd2(long a, long b) {
        if (a % b == 0) {
            return b;
        }
        return gcd2(b, a % b);
    }

    // a: 下限
    // b: 上限
    // c: 割る数
    static long num(long a, long b, long c) {
        long x = (b - a + 1) / c;
        if (((b - a + 1) % c) > (c - (a % c))) {
            x++;
        }
        return x;
    }
} public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        long a = sc.nextLong();
        long b = sc.nextLong();
        long c = sc.nextLong();
        long d = sc.nextLong();
        sc.close();

        // e: cとdの最大公約数
        long e = gcd2(c, d);
        // f: cとdの最小公倍数
        long f = (c / e) * (d / e) * e;

        // x: cで割り切れる数の個数
        long x = num(a, b, c);
        // y: dで割り切れる数の個数
        long y = num(a, b, d);
        // z: eで割り切れる数の個数
        long z = num(a, b, f);

        // 答え
        long ans = (b - a + 1) - (x + y - z);
        System.out.println(ans);
    }

    static long gcd(long a, long b) {
        if (a == b) {
            return a;
        } else if (a > b) {
            return gcd(b, a - b);
        } else {
            return gcd(a, b - a);
        }
    }

    // a > b
    static long gcd2(long a, long b) {
        if (a % b == 0) {
            return b;
        }
        return gcd2(b, a % b);
    }

    // a: 下限
    // b: 上限
    // c: 割る数
    static long num(long a, long b, long c) {
        long x = (b - a + 1) / c;
        if (((b - a + 1) % c) > (c - (a % c))) {
            x++;
        }
        return x;
    }
} Main
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        long a = sc.nextLong();
        long b = sc.nextLong();
        long c = sc.nextLong();
        long d = sc.nextLong();
        sc.close();

        // e: cとdの最大公約数
        long e = gcd2(c, d);
        // f: cとdの最小公倍数
        long f = (c / e) * (d / e) * e;

        // x: cで割り切れる数の個数
        long x = num(a, b, c);
        // y: dで割り切れる数の個数
        long y = num(a, b, d);
        // z: eで割り切れる数の個数
        long z = num(a, b, f);

        // 答え
        long ans = (b - a + 1) - (x + y - z);
        System.out.println(ans);
    }

    static long gcd(long a, long b) {
        if (a == b) {
            return a;
        } else if (a > b) {
            return gcd(b, a - b);
        } else {
            return gcd(a, b - a);
        }
    }

    // a > b
    static long gcd2(long a, long b) {
        if (a % b == 0) {
            return b;
        }
        return gcd2(b, a % b);
    }

    // a: 下限
    // b: 上限
    // c: 割る数
    static long num(long a, long b, long c) {
        long x = (b - a + 1) / c;
        if (((b - a + 1) % c) > (c - (a % c))) {
            x++;
        }
        return x;
    }
}
