[模板][洛谷P1835]素數密度(區間篩)
阿新 • • 發佈:2019-01-22
每個數n的最小質因子一定不超過
預處理出
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);
}