#include using namespace std; #pragma GCC optimize("Ofast") #define ll long long #define ld long double #define rep(i, a, b) for (int i = a; i < b; i++) #define rep1(i, a, b) for (int i = (b) - 1; i >= a; i--) #define endl '\n' #define vvii vector> #define vi vector #define vvll vector> #define vl vector template ostream& operator << (ostream &s, vector &P) { for (int i = 0; i < P.size(); ++i) { if (i > 0) { s << " "; } s << P[i]; } return s; } template bool chmax(T &a, T b){if (a < b){a = b;return true;}return false;} template bool chmin(T &a, T b){if (a > b){a = b;return true;}return false;} template T gcd(T a, T b){return (b == 0) ? a : gcd(b, a % b);} template T lcm(T a, T b){return a / gcd(a, b) * b;} templateT powMod(T x, T k, T m) {if (k == 0){return (T)1;}if (k % 2 == 0) {return powMod(x*x % m, k/2, m);}else{return x*powMod(x, k-1, m) % m;}} template T extgcd(T a,T b,T &x,T &y){T g = a;x = 1;y = 0;if (b != 0) {g = extgcd(b, a % b, y, x), y -= (a / b) * x;}return g;} template T invMod(T a,T m){T x,y;if (extgcd(a, m, x, y) == 1) {return (x + m) % m;}else{return -1;}} using Pii = pair; using Pll = pair; struct Eratos { vector primes; vector isprime; vector mebius; vector min_factor; Eratos(int MAX) : primes(), isprime(MAX + 1, true), mebius(MAX + 1, 1), min_factor(MAX + 1, -1) { isprime[0] = isprime[1] = false; min_factor[0] = 0, min_factor[1] = 1; for (int i = 2; i <= MAX; ++i) { if (!isprime[i]) continue; primes.push_back(i); mebius[i] = -1; min_factor[i] = i; for (int j = i * 2; j <= MAX; j += i) { isprime[j] = false; if ((j / i) % i == 0) mebius[j] = 0; else mebius[j] = -mebius[j]; if (min_factor[j] == -1) min_factor[j] = i; } } } // prime factorization vector> prime_factors(int n) { vector> res; while (n != 1) { int prime = min_factor[n]; int exp = 0; while (min_factor[n] == prime) { ++exp; n /= prime; } res.push_back(make_pair(prime, exp)); } return res; } // enumerate divisors vector divisors(int n) { vector res({1}); auto pf = prime_factors(n); for (auto p : pf) { int n = (int)res.size(); for (int i = 0; i < n; ++i) { int v = 1; for (int j = 0; j < p.second; ++j) { v *= p.first; res.push_back(res[i] * v); } } } return res; } }; const int maxn = 1e6 + 10; Eratos Primes(maxn); bool is_square(ll x){ ll l = 1; //l * l <= x ll r = 1e9 + 5; // l * l > x while (r - l > 1){ ll med = (r + l) / 2; if (med * med <= x){ l = med; }else{ r = med; } } if (l * l == x){ return true; }else{ return false; } } signed main(){ ios::sync_with_stdio(false); cin.tie(nullptr); ll L,R; cin >> L >> R; vector valid(R - L + 1); vector ok(R - L + 1); for (ll i = 0; i <= R - L;i++){ valid[i] = i + L; ok[i] = true; } for (int p : Primes.primes){ ll q = p; for (ll d = (L + q - 1) / q * q; d <= R;d += q){ int ord = 0; while(valid[d - L] % q == 0){ valid[d - L] /= q; ord++; } if (ord >= 2){ ok[d - L] = false; } } } int ans = 0; for (ll i = 0; i <= R - L;i++){ if (!ok[i]){ continue; } ans++; ll x = valid[i]; if (is_square(x) && x > 1){ ans--; } } cout << ans << endl; return 0; }