jzoj 5835. Prime
程序员文章站
2024-02-11 13:23:52
...
题目大意:
思路:
这题算不上一个套路题吧,可以看到R-L很小,可以线性筛搞过去,但是l前面的也去筛就太慢了,所以只考虑筛l~r区间里面的数,又因为r<10e14,所以只需要用min(sqrt(r),k),去筛l~r每一个数就好了。考场认为这样跑不过就没打!!打起来很方便呢。
程序:
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#define N 10000005
#define LL long long
LL ans,l,r,k,n,len;
LL h[N],flag[N],a[N];
int main(){
freopen("prime.in","r",stdin);
freopen("prime.out","w",stdout);
scanf("%lld%lld%lld",&l,&r,&k);
n=10000000;
for (LL i=2;i<n;i++){
if (!h[i]) h[i]=1,a[++len]=i;
for (LL j=1;j<=len;j++){
if (i*a[j]>n) break;
h[i*a[j]]=1;
if (!(i%a[j])) break;
}
}
for (LL i=1;i<=len;i++)
if (a[i]<=k){
LL ll=0;
if (l%a[i]!=0) ll=(l/a[i]+1)*a[i];
else ll=(l/a[i])*a[i];
for (LL j=ll;j<=r;j+=a[i]) if (a[i]<j-1) flag[j-l+1]=1;
}
for (LL i=l;i<=r;i++) if (!flag[i-l+1]) ans=ans^i;
printf("%lld",ans);
}
上一篇: 你好,容斥原理---层叠消融
下一篇: java中的参数传递(值传递等)