[欧拉筛] Jzoj P5835 Prime
题解
- 对于[1, min(k, √R)]中的每个质数p,将其在[max(L, 2 ∗ p), R]内的倍数标记一下
- 最后没标记的数就是类质数
代码
1 #include <cstdio> 2 #include <cmath> 3 #include <cstring> 4 using namespace std; 5 long long l,r,k,x,y,ans; 6 bool f[10000010],boo[10000010]; 7 int main() 8 { 9 freopen("prime.in","r",stdin); 10 freopen("prime.out","w",stdout); 11 scanf("%lld%lld%lld",&l,&r,&k); 12 if (k>sqrt(r)) k=sqrt(r); 13 memset(f,0,sizeof(f)); 14 memset(boo,0,sizeof(boo)); 15 f[1]=1; 16 for (long long i=2;i<=k;i++) if (!f[i]) for (long long j=i;j<=k/i;j++) f[i*j]=1; 17 for (long long i=1;i<=k;i++) 18 if (!f[i]) 19 { 20 if (l<=i&&i<=r) ans^=i; 21 x=l/i,y=r/i,x=x*i<l?x+1:x; 22 for (long long j=x;j<=y;j++) if (i*j>=l) boo[i*j-l]=1; 23 } 24 for (long long i=l;i<=r;i++) if (!boo[i-l]) ans^=i; 25 printf("%lld",ans); 26 return 0; 27 }