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

题目链接:

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

思路:

用埃氏筛法将 [ 1 , m ] [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;
}

猜你喜欢

转载自blog.csdn.net/qq_45228537/article/details/104716536