1. 程式人生 > >[模板][洛谷P1835]素數密度(區間篩)

[模板][洛谷P1835]素數密度(區間篩)

題目←

每個數n的最小質因子一定不超過n
預處理出m內的素數表,刪去每個素數在n-m區間內所有倍數,剩下的一定全為素數
del陣列採用下標偏移,i實際表示數n+i是否已被刪去
del陣列大小為0~m-n

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#define LL long long
using namespace std;
const LL MAXN = 1000000 + 50;
LL prime[MAXN];
bool sh[MAXN],del[MAXN];
int
cnt; void solve1(LL n){ for(LL i = 2;i <= n;i ++){ if(!sh[i])prime[++ cnt] = i; for(LL j = 1;j <= cnt&&i*prime[j] <= n;j ++){ sh[i*prime[j]] = true; if(i%prime[j] == 0)break; } } } int tot; void solve2(LL n,LL m){ for(LL i = 1
;i <= cnt;i ++){ LL j = n/prime[i]; if(j*prime[i] < n)j ++; if(j == 1)j ++; for(j;j*prime[i] <= m;j ++){ if(!del[j*prime[i] - n])tot ++; del[j*prime[i] - n] = true; } } } LL n,m; int main(){ scanf("%lld%lld",&n,&m); LL t = sqrt
(m) + 1; solve1(t); solve2(n,m); printf("%d",m - n + 1 - tot); }