【NOIP2017提高A组冲刺11.7】质数题解——欧拉筛

Description

小X 是一位热爱数学的男孩子,在茫茫的数字中,他对质数更有一种独特的情感。小X 认为,质数是一切自然数起源的地方。
在小X 的认知里,质数是除了本身和1 以外,没有其他因数的数字。
但由于小X 对质数的热爱超乎寻常,所以小X 同样喜欢那些虽然不是质数,但却是由两个质数相乘得来的数。
于是,我们定义,一个数是小X 喜欢的数,当且仅当其是一个质数,或是两个质数的乘积。
而现在,小X 想要知道,在L 到R 之间,有多少数是他喜欢的数呢?

Input

第一行输入一个正整数Q,表示询问的组数。
接下来Q 行。包含两个正整数L 和R。保证L≤R。

Output

输出Q 行,每行一个整数,表示小X 喜欢的数的个数。

Sample Input

输入1:

1
1 6

输入2:

10
282 491
31 178
645 856
227 367
267 487
474 697
219 468
582 792
315 612
249 307

输入3:

10
20513 96703
15236 86198
23185 78205
40687 48854
42390 95450
63915 76000
36793 92543
35347 53901
44188 76922
82177 90900

Sample Output

输出1:

5

样例1解释:

6以内的质数有2,3,5,而4=22,6=23。因此2,3,4,5,6都是小X 喜欢的数,而1 不是。

输出2:

97
78
92
65
102
98
114
90
133
29

输出3:

24413
23001
17784
2669
16785
3833
17712
6028
10442
2734

题解

题目大意

Q个询问,每个给l,r,求l到r的质数和由质数 × \times ×质数总和

欧拉筛

此处不详细讲,

	Fu(i,2,mx){
		if(bj[i]==0) v[++js]=i;
		Fu(j,1,js){
			if(v[j]*i>mx) break;
			bj[i*v[j]]=1;
			if(i%v[j]==0) break;
		}
	}

前缀和

枚举质数 × \times ×质数,用前缀和存起来

	Fu(i,1,js){
		sum[v[i]]=1;
		Fu(j,1,js){
			if(v[i]*v[j]>mx) break;
			sum[v[i]*v[j]]=1;
		}
	}
	Fu(i,1,mx) sum[i]+=sum[i-1];

询问

	scanf("%d",&n);
	Fu(i,1,n){
		scanf("%d%d",&l,&r);
		printf("%d\n",sum[r]-sum[l-1]);
	}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值