#include using namespace std; using ll=long long; #define rng(i,l,r) for(int i=int(l);i=int(l);i--) #define rrep(i,r) rrng(i,0,r) #define pb push_back #define eb emplace_back #define mp make_pair #define mt make_tuple #define one(x) memset(x,-1,sizeof(x)) #define zero(x) memset(x,0,sizeof(x)) #define F first #define S second #define bg begin() #define ed end() #define all(x) x.bg,x.ed #define si(x) int(x.size()) #define inf INT_MAX/2-100 #define infl LLONG_MAX/3 #ifdef LOCAL #define dmp(x) cerr<<__LINE__<<' '<<#x<<' '<void chmax(t&a,u b){if(avoid chmin(t&a,u b){if(busing vc=vector; templateusing vvc=vector>; using pi=pair; using pl=pair; using vi=vc; using vl=vc; ll readl(void){ ll x; cin>>x; return x; } int readi(void){ int x; cin>>x; return x; } string readstr(){ string s; cin>>s; return s; } vi readvi(int n,int off=0){ vi v(n); rep(i,n)v[i]=readi(),v[i]+=off; return v; } vl readvl(int n,int off=0){ vl v(n); rep(i,n)v[i]=readl(),v[i]+=off; return v; } template void print(t x,int suc=1){ cout< void print(const vc&v,int suc=1){ rep(i,si(v))print(v[i],i==int(si(v))-1?1:suc); } template bool inc(t a,t b,t c){ return !(c void compress(vc&v){ sort(all(v)); v.erase(unique(all(v)),v.ed); } template int lwb(const vc&v,const t&a){ return lower_bound(all(v),a)-v.bg; } template struct Compress{ vcv; Compress()=default; Compress(const vc&x){ add(x); } Compress(const initializer_list >&x){ for(auto &p:x)add(p); } void add(const t&x){ v.eb(x); } void add(const vc&x){ copy(all(x),back_inserter(v)); } void build(){ compress(v); } int get(const t&x)const{ return lwb(v,x); } vcget(const vc&x)const{ vcres(x); for(auto &p:res)p=get(p); return res; } const t &operator[](int x)const{ return v[x]; } }; void Yes(bool ex=true){ cout<<"Yes\n"; if(ex)exit(0); } void YES(bool ex=true){ cout<<"YES\n"; if(ex)exit(0); } void No(bool ex=true){ cout<<"No\n"; if(ex)exit(0); } void NO(bool ex=true){ cout<<"NO\n"; if(ex)exit(0); } void orYes(bool x,bool ex=true){ if(x)Yes(ex); else No(ex); } void orYES(bool x,bool ex=true){ if(x)YES(ex); else NO(ex); } void Possible(bool ex=true){ cout<<"Possible\n"; if(ex)exit(0); } void POSSIBLE(bool ex=true){ cout<<"POSSIBLE\n"; if(ex)exit(0); } void Impossible(bool ex=true){ cout<<"Impossible\n"; if(ex)exit(0); } void IMPOSSIBLE(bool ex=true){ cout<<"IMPOSSIBLE\n"; if(ex)exit(0); } void orPossible(bool x,bool ex=true){ if(x)Possible(ex); else Impossible(ex); } void orPOSSIBLE(bool x,bool ex=true){ if(x)POSSIBLE(ex); else IMPOSSIBLE(ex); } template struct Edge{ int s,t; T c; Edge(int x,T y):s(-1),t(x),c(y){} Edge(int x,int y,T z):s(x),t(y),c(z){} }; struct Unionfind{ vectorpar,sz; int n; Unionfind(int x=0):par(x,-1),sz(x,1),n(x){} void init(int x){ n=x; par.resize(n); sz.resize(n); fill(par.begin(),par.end(),-1); fill(sz.begin(),sz.end(),1); } int find(int x){ return par[x]==-1?x:(par[x]=find(par[x])); } bool same(int x,int y){ return find(x)==find(y); } bool unit(int x,int y){ x=find(x),y=find(y); if(x==y)return false; par[y]=x; sz[x]+=sz[y]; n--; return true; } int size(){ return n; } int size(int x){ return sz[find(x)]; } }; bool ip[200005]; int main(void){ cin.tie(0); ios::sync_with_stdio(0); int l,r; cin>>l>>r; Unionfind uf(r+1); int ans=r-l; for(int i=l;i<=r;i++){ for(int j=i*2;j<=r;j+=i){ if(!uf.same(i,j)){ ans--; uf.unit(i,j); } } } cout<