CSP.ac #60

质数求和(T1-20)
如果看不了请登入,如果还看不了就是你没去qbxt

很简单的一道区间筛的题目
题目大体意思:给你L,R,求[L,R] 的素数之和
对于 100%的数据,1<=L<=R<=10^9,R-L<=1000

#include <cstdio>
#include <iostream>
#include <string>
#include <cstring>
#include <cmath>
#include <algorithm>

#define int long long
#define db double
#define rr register

#define inf 1e9

using namespace std;

const int MAXN = 1e6 + 5;

inline int read() {
	int s = 0, f = 0;
	char ch = getchar();
	while (!isdigit(ch)) {f |= ch == '-'; ch = getchar();}
	while (isdigit(ch)) {s = s * 10 + (ch ^ 48); ch = getchar();}
	return f ? -s : s;
}

int l, r, tot, ans;

int prime[MAXN], a[MAXN], vis[MAXN];

inline int orao() {
	for (rr int i = 2; i <= 50000; i++) {
		if (!vis[i]) 
			prime[++tot] = i;
		for (rr int j = 1; j <= tot; j++) {
			if (prime[j] * i > 50000)
				break;
			vis[prime[j] * i] = 1;
			if (i % prime[j] == 0)
				break;
		}
	}
}

signed main() {
	orao();
	l = read();
	r = read();
	for (rr int i = 1; i <= tot; i++) {
		int q = max(2 * 1ll, (l - 1ll) / prime[i] + 1ll) * prime[i];
		for (rr int j = q; j <= r; j += prime[i]) 
			if (j - l >= 0)  
				a[j - l] = 1;
	}
	for (rr int i = 0; i <= r - l; i++)
		if (!a[i])
			ans += i + l;
	cout << ans;
}
posted @ 2020-04-28 10:30  Aliemo  阅读(112)  评论(0编辑  收藏  举报