#include #include #include #include #include #include #include #include #include #include #define mkp make_pair #define mkt make_tuple #define rep(i,n) for(int i = 0; i < (n); ++i) using namespace std; typedef long long ll; const ll MOD=1e9+7; template void chmin(T &a,const T &b){if(a>b) a=b;} template void chmax(T &a,const T &b){if(a rank,p; vector sz; DisjointSet(){} DisjointSet(int size){ rank.resize(size,0); p.resize(size,0); sz.resize(size,0); for(int i=0;irank[y]){ p[y]=x; sz[x]+=sz[y]; }else{ p[x]=y; sz[y]+=sz[x]; if(rank[x]==rank[y]){ rank[y]++; } } } int findSet(int x){ if(x!=p[x]){ p[x]=findSet(p[x]); } return p[x]; } int findSize(int x){ return sz[findSet(x)]; } }; int main(){ cin.tie(0); ios::sync_with_stdio(false); int L,R; cin>>L>>R; vector isprime(R+1,1); vector primes; for(ll i=2;i<=R;i++){ if(isprime[i]==0) continue; primes.push_back(i); for(ll j=2;i*j<=R;j++) isprime[i*j]=0; } DisjointSet us(R+1); for(int i=L;i<=R;i++){ for(int j=0;jR) break; us.unite(i,i*primes[j]); } } int ans=0; for(int i=L;i<=R;i++) if(us.findSet(i)==i) ans++; cout<