1. 程式人生 > >[luoguP1835] 素數密度_NOI導刊2011提高(04)(素數篩)

[luoguP1835] 素數密度_NOI導刊2011提高(04)(素數篩)

[1] targe .org get can clas div http ret

傳送門

數據辣麽大,怎麽搞?(L≤R≤2147483647)

註意到R-L≤1000000

所以可以直接篩R-L區間內的數,

但是需要用已知的小的素數篩,

R-L區間內的大部分數肯定能用較小的素數篩去,但是還有一些較大的數,可能等於兩個大質數的乘積,沒法被篩去。

但是又註意到,數據最大才10位,也就是說我們只需要用位數<=5的素數篩就可以了,所以先預處理出來,直接篩就ok了。

#include <cstdio>
#define N 1000001
#define max(x, y) ((x) > (y) ? (x) : (y))

int L, R, cnt, ans;
int prime[N];
bool notprime[N], ansprime[N];

int main()
{
	int i, j;
	scanf("%d %d", &L, &R);
	notprime[0] = notprime[1] = 1;
	for(i = 2; i <= 100000; i++)
	{
		if(!notprime[i]) prime[++cnt] = i;
		for(j = i + i; j <= 100000; j += i) notprime[j] = 1;
	}
	for(i = 1; i <= cnt; i++)
		for(j = max(2, L / prime[i]); j <= R / prime[i]; j++)
			ansprime[j * prime[i] - L] = 1;
	for(i = 0; i <= R - L; i++)
		if(!ansprime[i])
			ans++;
	printf("%d\n", ans);
	return 0;
} 

  

[luoguP1835] 素數密度_NOI導刊2011提高(04)(素數篩)