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
分析:
其实很简单的一道题,考场上只打了暴力。
对于类质数定义,有
i
i
的范围是。我们知道, 一个数
x
x
是合数,必然存在一个小于的因子。所以,
i
i
的范围变为,范围就变成
107
10
7
级的了,直接线筛质数。考虑怎样计算
[L,R]
[
L
,
R
]
范围内的合法的数,我们可以枚举线筛的质数的倍数,然后标记在
[L,R]
[
L
,
R
]
范围内的数即可。因为
R−l<=107
R
−
l
<=
10
7
,这样做是
O(nlog(logn))
O
(
n
l
o
g
(
l
o
g
n
)
)
级别的。
代码:
#include <iostream>
#include <cstdio>
#include <cmath>
#define LL long long
const int maxn=1e7+7;
using namespace std;
LL prime[maxn],not_prime[maxn],a[maxn];
LL l,r,k,ans,cnt;
void getprime(LL n)
{
for (LL i=2;i<=n;i++)
{
if (!not_prime[i])
{
prime[++cnt]=i;
}
for (LL j=1;j<=cnt;j++)
{
if (i*prime[j]>n) break;
not_prime[i*prime[j]]=1;
if (i%prime[j]==0) break;
}
}
}
int main()
{
freopen("prime.in","r",stdin);
freopen("prime.out","w",stdout);
scanf("%lld%lld%lld",&l,&r,&k);
LL T=trunc(sqrt(r));
getprime(min(T,k));
for (LL i=1;i<=cnt;i++)
{
LL w=(l/prime[i])+(l%prime[i]!=0);
for (LL j=w*prime[i];j<=r;j+=prime[i])
{
if (j!=prime[i]) a[j-l]=1;
}
}
for (LL i=l;i<=r;i++)
{
if (!a[i-l]) ans^=i;
}
printf("%lld",ans);
}