洛谷 P1865 A % B Problem(埃氏篩法)

題目鏈接:

https://www.luogu.com.cn/problem/P1865

思路:

用埃氏篩法將[1,m][1,m]間的素數全部篩選出來,再用前綴和數組維護一下即可;

代碼:

#include<bits/stdc++.h>

using namespace std;

const int maxn = 1e6 + 5;
bool prime[maxn];
int sum[maxn];
void sieve(int n) {
	for(int i = 0; i <= n; ++i) prime[i] = true;
	prime[0] = prime[1] = false;
	for(int i = 2; i <= n; ++i) if(prime[i]) {
		for(int j = i << 1; j <= n; j += i) {
			prime[j] = false;
		}
	}
	for(int i = 1; i <= n; ++i) {
		sum[i] = sum[i - 1] + prime[i];	
	}
}

int main() {
#ifdef MyTest
	freopen("Sakura.txt", "r", stdin);
#endif
	int kase, m;
	scanf("%d %d", &kase, &m);
	sieve(m);
	while(kase--) {
		int l, r;
		scanf("%d %d", &l, &r);
		if(l < 1 || l > m || r < 1 || r > m) puts("Crossing the line");
		else printf("%d\n", sum[r] - sum[l - 1]);
	}
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章