#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+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwp1c2luZyBsbCA9IGxvbmcgbG9uZzsKCi8qCiAgICAxJ2RlbiBtYXhfcG93ZXInYSBrYWRhcmtpIGhlciBwIGnDp2luOgogICAgICAgIHAgKiAxLCBwICogMiwgLi4uLCBwICogYm91bmQKICAgIEthw6cgZmFya2zEsSBzYXnEsSBvbGR1xJ91bnUgYnVsdXlvci4KICAgIChJbmNsdXNpb24tZXhjbHVzaW9uKQoKICAgIG1uLCBFS09LJ3UgYWzEsW5hbiBzYXnEsWxhcmEgZGFoaWwgb2xhbiBlbiBrw7zDp8O8ayBzYXnEsS4KICAgIG1uID09IDFlOSBkZW1layBoacOnIHNhecSxIHNlw6dtZW1pxZ9peiBkZW1lay4KKi8KbGwgc29sdmVfZm9yX21hc2soaW50IG1heF9wb3dlciwgaW50IGJvdW5kLCBpbnQgaSA9IDEsIGxsIGxjbSA9IDEsIGludCBjb2VmID0gLTEsIGludCBtbiA9IDFlOSkgewogICAgaWYgKGxjbSA+IGJvdW5kKSAvLyAwIGdlbGVjZWt0aXIgaGVyIHTDvHJsw7wuCiAgICAgICAgcmV0dXJuIDA7CgogICAgaWYgKGkgPT0gbWF4X3Bvd2VyICsgMSkgewogICAgICAgIGlmIChtbiA9PSAxZTkpCiAgICAgICAgICAgIHJldHVybiAwOwoKICAgICAgICAvLyBPcnRhayBzYXnEsWxhciAobW4gKiBib3VuZCknYSBrYWRhciBvbGFjYWt0xLFyLgogICAgICAgIHJldHVybiAobGwpY29lZiAqIG1uICogYm91bmQgLyBsY207CiAgICB9CgogICAgbGwgd2l0aG91dCA9IHNvbHZlX2Zvcl9tYXNrKG1heF9wb3dlciwgYm91bmQsIGkgKyAxLCBsY20sIGNvZWYsIG1uKTsKICAgIGxjbSA9IGxjbSAvIF9fZ2NkKGxjbSwgKGxsKWkpICogaTsKICAgIGxsIHdpdGggPSBzb2x2ZV9mb3JfbWFzayhtYXhfcG93ZXIsIGJvdW5kLCBpICsgMSwgbGNtLCAtY29lZiwgbW4gPT0gMWU5ID8gaSA6IG1uKTsKICAgIHJldHVybiB3aXRob3V0ICsgd2l0aDsKfQoKLyoKICAgIG4gPSBhXmsKICAgIEVuIGvDvMOnw7xrIGEgPiAwIGnDp2luIHthLCBrfSBkw7ZuZMO8csO8eW9yLgoqLwphcnJheTxpbnQsIDI+IGdldF9tYXNrKGludCBuKSB7CiAgICBpbnQgaW5pdF9uID0gbjsKICAgIHZlY3RvcjxhcnJheTxpbnQsIDI+PiBmYWN0b3JpemF0aW9uOwogICAgaW50IGcgPSAwOwogICAgZm9yIChpbnQgaSA9IDI7IGkgKiBpIDw9IG47IGkrKykgewogICAgICAgIGlmIChuICUgaSkKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgaW50IGV4cCA9IDA7CiAgICAgICAgd2hpbGUgKG4gJSBpID09IDApCiAgICAgICAgICAgIG4gLz0gaSwgZXhwKys7CiAgICAgICAgZmFjdG9yaXphdGlvbi5wdXNoX2JhY2soe2ksIGV4cH0pOwogICAgICAgIGcgPSBfX2djZChnLCBleHApOwogICAgfQogICAgaWYgKG4gPiAxKSB7CiAgICAgICAgcmV0dXJuIHtpbml0X24sIDF9OwogICAgfQoKICAgIGludCBtYXNrID0gMTsKICAgIGZvciAoYXV0byAmW3ByaW1lLCBleHBdIDogZmFjdG9yaXphdGlvbikgewogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhwIC8gZzsgaSsrKQogICAgICAgICAgICBtYXNrICo9IHByaW1lOwogICAgfQoKICAgIHJldHVybiB7bWFzaywgZ307Cn0KCmludCBtYWluKCkgewogICAgaW50IGExLCBhMiwgYjEsIGIyOwogICAgY2luID4+IGExID4+IGEyID4+IGIxID4+IGIyOwogICAgdmVjdG9yPGludD4gbWF4X3Bvd2VycyhhMiArIDEpOwogICAgZm9yIChpbnQgYSA9IGExOyBhIDw9IGEyOyBhKyspIHsKICAgICAgICBhdXRvIFttYXNrLCBleHBdID0gZ2V0X21hc2soYSk7CiAgICAgICAgbWF4X3Bvd2Vyc1ttYXNrXSA9IGV4cDsKICAgIH0KICAgIGxsIGFucyA9IDA7CiAgICBmb3IgKGludCBtYXhfcG93ZXIgOiBtYXhfcG93ZXJzKSB7CiAgICAgICAgYW5zICs9IHNvbHZlX2Zvcl9tYXNrKG1heF9wb3dlciwgYjIpIC0gc29sdmVfZm9yX21hc2sobWF4X3Bvd2VyLCBiMSAtIDEpOwogICAgfQogICAgY291dCA8PCBhbnMgPDwgIlxuIjsKfQ==