这个是烂大街的题吧…
反正预处理素数,判断,右-左就完啦
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <string>
#include <cmath>
#define MAXN 1000011
using namespace std;
int T,n,m,prime[33333],cnt;
inline bool check(int x)
{
int temp=sqrt(x);
for (int i=2;i<=temp;i++)
if(x%i==0)return false;
return true;
}
bool visit[MAXN];
int main()
{ freopen("prime.in","r",stdin);
freopen("prime.out","w",stdout);
scanf("%d",&T);
for (int i=2;i<=35000;i++)
if(check(i))prime[++cnt]=i;
while(T--)
{
memset(visit,0,sizeof(visit));
scanf("%d%d",&n,&m);
for (int i=1;i<=cnt;i++)
{
int temp=n/prime[i]*prime[i];
if(temp<n)temp+=prime[i];
for (int j=temp;j<=m;j+=prime[i])
if(!visit[j-n+1]&&j!=prime[i])visit[j-n+1]=1;
}
int tot=0;
for (int i=1;i<=m-n+1;i++)
if(!visit[i]&&i+n-1!=1) ++tot;
printf("%d\n",tot);
}
return 0;
}