题解 P1835 【素数密度_NOI导刊2011提高(04)】
此题不少书上都有, 就是考筛法的应用. 首先由于
然后我们用埃式筛法, 从
然而……
此处在循环的时候一定要注意! 一定要注意! 一定要注意! 如果用 我在此处调了一个晚上. 所以我们此处要么特判一下, 要么就改用 (不要问我怎么知道的).
以下是代码:
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
typedef long long ll;
ll vis[1000007], notP[100007], prime[100007];
int main(){
ll l, r;
cin >> l >> r;
memset(vis, 0ll, sizeof(vis));
memset(notP, 0ll, sizeof(notP));
ll cnt = 0ll;
for(ll i = 2ll; i <= sqrt(r); ++i){
if(!notP[i])
prime[++cnt] = i;
for(ll j = 1ll; j <= cnt; ++j){
if(i * prime[j] > sqrt(r))
break;
notP[prime[j] * i] = 1ll;
if(!i % prime[j])
break;
}
}
for(ll i = 1ll; i <= cnt; ++i){
ll j;
if(l % prime[i])
j = (l / prime[i] + 1ll) * prime[i];
else
j = l;
if(j == prime[i])
j += prime[i];
for(; j <= r; j += prime[i])
vis[j - l] = 1ll;
}
ll ans = 0ll;
for(ll i = l; i <= r; ++i)
if(!vis[i - l])
++ans;
cout << ans << endl;
return 0;
}