素数密度 - 洛谷https://www.luogu.com.cn/problem/P1835
注意一点求合数的时候只能从大于等于l的开始
#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <cstring>
#include <set>
#include <unordered_map>
#include <cmath>
#include <map>
#include <cctype>
#include <cstdlib>
#include <deque>
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
const int MN = 65005;
const int MAXN = 1e6 + 5;
const int INF = 0x3f3f3f3f;
#define IOS ios::sync_with_stdio(false)
#define lowbit(x) ((x)&(-x))
int prime[MAXN];
bool isp[MAXN];
int cnt;
inline void init() {
for (int i = 2; i <= 50000; i++) {
if (!isp[i]) {
prime[++cnt] = i;
for (int j = 1; j <= cnt && i * prime[j] <= 50000; j++) {
isp[prime[j]*i] = true;
if (i % prime[j] == 0)
break;
}
}
}
}
int main() {
ll l, r;
init();
scanf("%lld %lld", &l, &r);
l=l==1?2:l;
memset(isp, 0, sizeof(isp));
for (int i = 1; i <= cnt; i++) {
ll p = prime[i];
ll st=(l+p-1)/p*p>2*p?(l+p-1)/p*p:2*p;
for (ll j = st; j <= r; j += p) {
isp[j - l+1] = true;
}
}
int ans = 0;
for (int i = 1; i <= r - l+1; i++) {
if (!isp[i])
ans++;
}
printf("%d", ans);
return 0;
}