#include <iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
const int maxn=9*1e8;
int cnt;
bool p[maxn];
bool prime[maxn];
void is_prime(int n,int m)
{
cnt=m-n;
memset(p,true,sizeof(p));
for(int i=0;i<cnt;i++) prime[i]=true;
if(n<2)
{
prime[0]=false;
cnt--;
if(n==0)
{
prime[1]=false;
cnt--;
}
}
int e=floor(sqrt(m)+0.5);
for(int i=2;i<=e;i++)
{
if(p[i]) {
int pos;
bool flag=false;
for(int j=i*i;j<=e;j+=i)
p[j]=false;
for(int j=n;j<m;j++)
if(!(j%i)&&j!=i) {
pos=j;
flag=true;
break;
}
if(flag) {
for(int j=pos;j<m;j+=i)
if(prime[j-n]) {
cnt--;
prime[j-n]=false;
}
}
}
}
}
int main()
{
int n,m; //左闭右开的区间
while(scanf("%d%d",&n,&m)==2&&m>n)
{
is_prime(n,m);
printf("%d\n",cnt);
}
return 0;
}
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
const int maxn=9*1e8;
int cnt;
bool p[maxn];
bool prime[maxn];
void is_prime(int n,int m)
{
cnt=m-n;
memset(p,true,sizeof(p));
for(int i=0;i<cnt;i++) prime[i]=true;
if(n<2)
{
prime[0]=false;
cnt--;
if(n==0)
{
prime[1]=false;
cnt--;
}
}
int e=floor(sqrt(m)+0.5);
for(int i=2;i<=e;i++)
{
if(p[i]) {
int pos;
bool flag=false;
for(int j=i*i;j<=e;j+=i)
p[j]=false;
for(int j=n;j<m;j++)
if(!(j%i)&&j!=i) {
pos=j;
flag=true;
break;
}
if(flag) {
for(int j=pos;j<m;j+=i)
if(prime[j-n]) {
cnt--;
prime[j-n]=false;
}
}
}
}
}
int main()
{
int n,m; //左闭右开的区间
while(scanf("%d%d",&n,&m)==2&&m>n)
{
is_prime(n,m);
printf("%d\n",cnt);
}
return 0;
}