P1835 素数密度
传送门
思路
任何合数都能分解成多个素数之积(至少两个),那么一个很大的合数N必定可以通过sqrt(N)以内的质数筛掉。(例如只要有1到50000内的质数就可以筛掉int型数据内的所有合数)
代码
#include
#include
#define MAX 50000
using namespace std;
typedef long long ll;
ll prime[MAX + 1], cnt; bool vis[1000005];
int main(void)
{
ll L = 0, R = 0, ans = 0;
cin >> L >> R;
if (L == 1)L = 2;
for (ll i = 2; i <= MAX; i++)
{
if (!vis[i])prime[++cnt] = i;
for (ll j = 1; j <= cnt && i * prime[j] <= MAX; j++)
{
vis[i * prime[j]] = true;
if (i % prime[j] == 0)break;
}
}
memset(vis, false, sizeof(vis));
for (int i = 1; i <= cnt; i++)
{
ll p = prime[i], start = max((L - 1) / p * p + p, 2 * p);
for (ll j = start; j <= R; j += p)vis[j - L + 1] = true;
}
for (int i = 1; i <= R - L + 1; i++)
if (!vis[i])ans++;
cout << ans;
return 0;
}