传送门
一个素数板子题,也没有什么可分析的。讲下流程吧。
流程
欧拉筛中间用前缀和记录一下。
代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int c[N],n,T;
int vis[N],pri[N>>1],num;
void euler(int n)
{
for(int i=2;i<=n;i++)
{
c[i]=c[i-1];//前缀和
if(!vis[i]) pri[++num]=i,c[i]++;
for(int j=1;j<=num&&i*pri[j]<=n;j++)
{
vis[i*pri[j]]=1;
if(i%pri[j]==0) break;
}
}
}
int main()
{
scanf("%d%d",&T,&n);
euler(n);//欧拉筛
while(T--)
{
int x,y;
scanf("%d%d",&x,&y);
if(x<1||x>n||y<1||y>n||x>y) printf("Crossing the line\n");
else printf("%d\n",c[y]-c[x-1]);//注意端点,要把x处算上
}
return 0;
}