#include<cstdio> int n,m,l,r,a[1000000]; voidprime(){ for (int i=2;i<=m;i++)if (!a[i]) for (int j=i*2;j<=m;j+=i)a[j]=1;//标准线筛 for (int i=2;i<=m;i++)a[i]=!a[i],a[i]+=a[i-1];//处理前缀和:直接在同一个数组里处理,a[i]=!a[i]是把原来对质数的标记0改成1,对合数的标记1改成0,然后就可以放心地加上前面的了 } template <typename _Tp> inlinevoidread(_Tp &x){ int w=1;char c=0;x=0; while (c^'-'&&(c<'0'||c>'9'))c=getchar(); if (c=='-')w=-1,c=getchar(); while (c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar(); x*=w; } inlinevoidwrite(int n){ if(n==0) return; write(n/10); putchar(n%10+'0'); } intmain(){ read(n),read(m); prime(); while (n--){ read(l),read(r); if (l<1||l>m||r<1||r>m){puts("Crossing the line");continue;} if (a[r]-a[l-1])write(a[r]-a[l-1]);//标准前缀和输出方式 elseputchar('0');puts(""); } }//至于某些多打的部分是快读+快输,个人喜好。