您的位置:首页 > 其它

计蒜客 noip 模拟#4Day1T1 小X的素数 【线性筛】

2017-11-05 20:34 369 查看
题目链接:https://nanti.jisuanke.com/t/17322

题意:如果一个数是质数或者是两个质数之积那么这个数就称为 XX数,多次查询,每次询问 区间 [l,r] 之间的 XX数个数,查询次数 q≤105 询问区间 l,r<
bdae
span class="mo" id="MathJax-Span-336" style="font-family: MathJax_Main; padding-left: 0.269em;">≤107

题解:

首先很愉快的想到50%的做法,线性筛预处理一波,加一个前缀和优化就行了。

但……好像是d1t1啊?好像不够啊?

我们可以在线性筛的过程中将 liked[] 预处理出来,就 ok 了。

经过多次愉快的WA发现自己将10^7写成了10^6了。爽

代码:

#include <cstdio>
#include <cstring>

int Q;
const int XN=10000005,size=664579+10000;
int prime[XN];
bool notprime[XN],liked[XN];
int cnt=0;

void xxs(){
for(int i=2;i<=10000000;i++){
if(!notprime[i]){
prime[++cnt]=i;liked[i]=1;
for(int j=1;j<=cnt;j++){
if(1ll*prime[j]*i>10000000ll)break;
liked[prime[j]*i]=1;
notprime[prime[j]*i]=1;
}
}else{
for(int j=1;j<=cnt;j++){
if(1ll*prime[j]*i>10000000ll)break;
notprime[prime[j]*i]=1;
if(i%prime[j]==0)break;
}
}
}
}
int sum[10000005];
void init(){
for(int i=1;i<=10000000;i++)
if(liked[i])sum[i]=sum[i-1]+1;
else sum[i]=sum[i-1];
}

int main(){
xxs(); init();
scanf("%d",&Q);
while(Q--){
int l,r,ans=0;
scanf("%d%d",&l,&r);
printf("%d\n",sum[r]-sum[l-1]);
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: