列表

详情


NC206800. Prime

描述

多多知道质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
现在他想知道在一个闭区间内,有多少个质数?他会询问多次,请你回答他。

输入描述

第一行输入一个正整数 T,代表询问次数  (1 ≤ T ≤ 100000)
接下来 T 行,每行输入两个正整数 a,b 表示查询范围为 [ a,b ]  (1 ≤ a ≤ 107,a ≤ b ≤ 107)

输出描述

对于每次询问,输出一个整数,表示在 [ a,b ] 范围内质数的个数

示例1

输入:

3
1 10
1 100
1 1000

输出:

4
25
168

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 671ms, 内存消耗: 79352K, 提交时间: 2020-06-14 14:00:42

#include<bits/stdc++.h>
using namespace std;
int f[10000005];
int g[10000005];
void s(int a){
	f[1]=0;
	g[1]=1;
	for(int i=2;i<=a;i++){
		if(g[i]==0){
		f[i]=f[i-1]+1;
		for(int j=2*i;j<=a;j+=i){
			g[j]=1;
		} 
	}
	else
	f[i]=f[i-1];
}
}
int main(){
	int a,x,y;
	cin>>a;
	s(10000000);
	for(int i=1;i<=a;i++){
	cin>>x>>y;
	cout<<f[y]-f[x-1]<<endl;
}
}

C++11(clang++ 3.9) 解法, 执行用时: 525ms, 内存消耗: 157672K, 提交时间: 2020-06-15 10:38:58

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll a[10000005],v[10000005];
int main(){ 
	ll i,j,t,b,c,sum=0;
	for(i=2;i<=10000000;i++){
		if(v[i]==0){
			for(j=2*i;j<=10000000;j+=i){
				v[j]=1;
			}
			sum++;
		}
		a[i]=sum;
	}
	scanf("%lld",&t);
	while(t--){
		scanf("%lld%lld",&b,&c);
		printf("%lld\n",a[c]-a[b-1]);
	}
} 

上一题