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