[欧拉筛] Jzoj P5835 Prime

Description

 

Input

Output

 

Sample Input

Input 1
2 16 2
Input 2
100 1000 2333333
Input 3
10000000000 10000001000 423

Sample Output

Output 1
3
Output 2
561
Output 3
170
 

Data Constraint

 

Hint

 

 

题解

  • 对于[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 }

 

posted @ 2018-08-21 16:25  BEYang_Z  阅读(198)  评论(0编辑  收藏  举报