#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";
}