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]);
	}
}

posted @ 2017-11-07 15:30  扩展的灰(Extended_Ash)  阅读(131)  评论(0编辑  收藏  举报