#include <bits/stdc++.h>
using namespace std;
using ll = long long;
/*
    1'den max_power'a kadarki her p için:
        p * 1, p * 2, ..., p * bound
    Kaç farklı sayı olduğunu buluyor.
    (Inclusion-exclusion)
    mn, EKOK'u alınan sayılara dahil olan en küçük sayı.
    mn == 1e9 demek hiç sayı seçmemişiz demek.
*/
ll solve_for_mask(int max_power, int bound, int i = 1, ll lcm = 1, int coef = -1, int mn = 1e9) {
    if (lcm > bound) // 0 gelecektir her türlü.
        return 0;
    if (i == max_power + 1) {
        if (mn == 1e9)
            return 0;
        // Ortak sayılar (mn * bound)'a kadar olacaktır.
        return (ll)coef * mn * bound / lcm;
    }
    ll without = solve_for_mask(max_power, bound, i + 1, lcm, coef, mn);
    lcm = lcm / __gcd(lcm, (ll)i) * i;
    ll with = solve_for_mask(max_power, bound, i + 1, lcm, -coef, mn == 1e9 ? i : mn);
    return without + with;
}
/*
    n = a^k
    En küçük a > 0 için {a, k} döndürüyor.
*/
array<int, 2> get_mask(int n) {
    int init_n = n;
    vector<array<int, 2>> factorization;
    int g = 0;
    for (int i = 2; i * i <= n; i++) {
        if (n % i)
            continue;
        int exp = 0;
        while (n % i == 0)
            n /= i, exp++;
        factorization.push_back({i, exp});
        g = __gcd(g, exp);
    }
    if (n > 1) {
        return {init_n, 1};
    }
    int mask = 1;
    for (auto &[prime, exp] : factorization) {
        for (int i = 0; i < exp / g; i++)
            mask *= prime;
    }
    return {mask, g};
}
int main() {
    int a1, a2, b1, b2;
    cin >> a1 >> a2 >> b1 >> b2;
    vector<int> max_powers(a2 + 1);
    for (int a = a1; a <= a2; a++) {
        auto [mask, exp] = get_mask(a);
        max_powers[mask] = exp;
    }
    ll ans = 0;
    for (int max_power : max_powers) {
        ans += solve_for_mask(max_power, b2) - solve_for_mask(max_power, b1 - 1);
    }
    cout << ans << "\n";
}