Jzoj5458【NOIP2017提高A组冲刺11.7】质数
小X 是一位热爱数学的男孩子,在茫茫的数字中,他对质数更有一种独特的情感。小X 认为,质数是一切自然数起源的地方。
在小X 的认知里,质数是除了本身和1 以外,没有其他因数的数字。
但由于小X 对质数的热爱超乎寻常,所以小X 同样喜欢那些虽然不是质数,但却是由两个质数相乘得来的数。
于是,我们定义,一个数是小X 喜欢的数,当且仅当其是一个质数,或是两个质数的乘积。
而现在,小X 想要知道,在L 到R 之间,有多少数是他喜欢的数呢?
今天题目放水了,10点半打完在机房玩纸牌,结果只赢了一局qwq
让后第三题就爆炸剩下10分了qwq
当然这道题相信各位还是可以一眼秒的
基本线性筛,把质数表筛出来之后一个个乘起来,大过max就退出好了
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define M 10000000
using namespace std;
bool vis[10000010],v2[10000010];
int w[3000010],t,sum[10000010],n;
int main(){
freopen("prime.in","r",stdin);
freopen("prime.out","w",stdout);
scanf("%d",&n);
for(int i=2;i<=M;++i){
if(!vis[i]){
w[++t]=i;
for(int j=1;j<=t&&i*w[j]<=M;++j) vis[i*w[j]]=1;
} else for(int j=1;j<=t&&i*w[j]<=M;++j){
vis[i*w[j]]=v2[i*w[j]]=1;
if(i%w[j]==0) break;
}
}
for(int i=vis[1]=v2[1]=1;i<=M;++i) sum[i]=sum[i-1]+!v2[i];
for(int x,y;n--;){
scanf("%d%d",&x,&y);
printf("%d\n",sum[y]-sum[--x]);
}
}