Jzoj5458【NOIP2017提高A组冲刺11.7】质数

来源:互联网 发布:变频器仿真软件 编辑:程序博客网 时间:2024/05/23 19:15

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

原创粉丝点击