#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";
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnVzaW5nIGxsID0gbG9uZyBsb25nOwovKgogICAgMSdkZW4gbWF4X3Bvd2VyJ2Ega2FkYXJraSBoZXIgcCBpw6dpbjoKICAgICAgICBwICogMSwgcCAqIDIsIC4uLiwgcCAqIGJvdW5kCiAgICBLYcOnIGZhcmtsxLEgc2F5xLEgb2xkdcSfdW51IGJ1bHV5b3IuCiAgICAoSW5jbHVzaW9uLWV4Y2x1c2lvbikKICAgIG1uLCBFS09LJ3UgYWzEsW5hbiBzYXnEsWxhcmEgZGFoaWwgb2xhbiBlbiBrw7zDp8O8ayBzYXnEsS4KICAgIG1uID09IDFlOSBkZW1layBoacOnIHNhecSxIHNlw6dtZW1pxZ9peiBkZW1lay4KKi8KbGwgc29sdmVfZm9yX21hc2soaW50IG1heF9wb3dlciwgaW50IGJvdW5kLCBpbnQgaSA9IDEsIGxsIGxjbSA9IDEsIGludCBjb2VmID0gLTEsIGludCBtbiA9IDFlOSkgewogICAgaWYgKGxjbSA+IGJvdW5kKSAvLyAwIGdlbGVjZWt0aXIgaGVyIHTDvHJsw7wuCiAgICAgICAgcmV0dXJuIDA7CiAgICBpZiAoaSA9PSBtYXhfcG93ZXIgKyAxKSB7CiAgICAgICAgaWYgKG1uID09IDFlOSkKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgLy8gT3J0YWsgc2F5xLFsYXIgKG1uICogYm91bmQpJ2Ega2FkYXIgb2xhY2FrdMSxci4KICAgICAgICByZXR1cm4gKGxsKWNvZWYgKiBtbiAqIGJvdW5kIC8gbGNtOwogICAgfQogICAgbGwgd2l0aG91dCA9IHNvbHZlX2Zvcl9tYXNrKG1heF9wb3dlciwgYm91bmQsIGkgKyAxLCBsY20sIGNvZWYsIG1uKTsKICAgIGxjbSA9IGxjbSAvIF9fZ2NkKGxjbSwgKGxsKWkpICogaTsKICAgIGxsIHdpdGggPSBzb2x2ZV9mb3JfbWFzayhtYXhfcG93ZXIsIGJvdW5kLCBpICsgMSwgbGNtLCAtY29lZiwgbW4gPT0gMWU5ID8gaSA6IG1uKTsKICAgIHJldHVybiB3aXRob3V0ICsgd2l0aDsKfQovKgogICAgbiA9IGFeawogICAgRW4ga8O8w6fDvGsgYSA+IDAgacOnaW4ge2EsIGt9IGTDtm5kw7xyw7x5b3IuCiovCmFycmF5PGludCwgMj4gZ2V0X21hc2soaW50IG4pIHsKICAgIGludCBpbml0X24gPSBuOwogICAgdmVjdG9yPGFycmF5PGludCwgMj4+IGZhY3Rvcml6YXRpb247CiAgICBpbnQgZyA9IDA7CiAgICBmb3IgKGludCBpID0gMjsgaSAqIGkgPD0gbjsgaSsrKSB7CiAgICAgICAgaWYgKG4gJSBpKQogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICBpbnQgZXhwID0gMDsKICAgICAgICB3aGlsZSAobiAlIGkgPT0gMCkKICAgICAgICAgICAgbiAvPSBpLCBleHArKzsKICAgICAgICBmYWN0b3JpemF0aW9uLnB1c2hfYmFjayh7aSwgZXhwfSk7CiAgICAgICAgZyA9IF9fZ2NkKGcsIGV4cCk7CiAgICB9CiAgICBpZiAobiA+IDEpIHsKICAgICAgICByZXR1cm4ge2luaXRfbiwgMX07CiAgICB9CiAgICBpbnQgbWFzayA9IDE7CiAgICBmb3IgKGF1dG8gJltwcmltZSwgZXhwXSA6IGZhY3Rvcml6YXRpb24pIHsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4cCAvIGc7IGkrKykKICAgICAgICAgICAgbWFzayAqPSBwcmltZTsKICAgIH0KICAgIHJldHVybiB7bWFzaywgZ307Cn0KaW50IG1haW4oKSB7CiAgICBpbnQgYTEsIGEyLCBiMSwgYjI7CiAgICBjaW4gPj4gYTEgPj4gYTIgPj4gYjEgPj4gYjI7CiAgICB2ZWN0b3I8aW50PiBtYXhfcG93ZXJzKGEyICsgMSk7CiAgICBmb3IgKGludCBhID0gYTE7IGEgPD0gYTI7IGErKykgewogICAgICAgIGF1dG8gW21hc2ssIGV4cF0gPSBnZXRfbWFzayhhKTsKICAgICAgICBtYXhfcG93ZXJzW21hc2tdID0gZXhwOwogICAgfQogICAgbGwgYW5zID0gMDsKICAgIGZvciAoaW50IG1heF9wb3dlciA6IG1heF9wb3dlcnMpIHsKICAgICAgICBhbnMgKz0gc29sdmVfZm9yX21hc2sobWF4X3Bvd2VyLCBiMikgLSBzb2x2ZV9mb3JfbWFzayhtYXhfcG93ZXIsIGIxIC0gMSk7CiAgICB9CiAgICBjb3V0IDw8IGFucyA8PCAiXG4iOwp9