#include using namespace std; #define rep(i,n) REP(i,0,n) #define REP(i,s,e) for(int i=(s); i<(int)(e); i++) #define repr(i, n) REPR(i, n, 0) #define REPR(i, s, e) for(int i=(int)(s-1); i>=(int)(e); i--) #define pb push_back #define all(r) r.begin(),r.end() #define rall(r) r.rbegin(),r.rend() #define fi first #define se second typedef long long ll; typedef vector vi; typedef vector vl; typedef pair pii; typedef pair pll; const ll INF = 1e18; const ll MOD = 1e9 + 7; const double EPS = 1e-8; template T chmax(T& a, const T& b){return a = (a > b ? a : b);} template T chmin(T& a, const T& b){return a = (a < b ? a : b);} struct UF{ //O(loga(n)) int n; int m; vi d, r; UF(int n) : n(n), m(n), d(n, -1), r(n, 0){}; int root(int i){ if(d[i] < 0) return i; return d[i] = root(d[i]); } bool same(int x, int y){ return root(x) == root(y); } bool unite(int x, int y){ x = root(x); y = root(y); if(x == y) return false; if(r[x] < r[y]) swap(x, y); else if(r[x] == r[y]) r[x]++; d[x] += d[y]; d[y] = x; --m; return true; } int size(int i){ return -d[root(i)]; } int size() { return m; } }; int main(){ int l, r; cin >> l >> r; ++r; UF uf(r); vector a(r, 1); rep(i, l) a[i] = 0; REP(i, l, r) if(a[i]) { for(int j = i+i; j< r; j+=i) { a[j] = 0; uf.unite(i, j); } } cout << uf.size() - l - 1<< '\n'; return 0; }