RT,有大佬能看看是怎么回事吗,感谢
#include <iostream>
using namespace std;
const int maxb = 1e5+5;
int a, b, p, idx, prime[maxb>>4], fa[maxb];
bool not_prime[maxb];
int find(int x) {
if (fa[x] == x) return x;
else return fa[x] = find(fa[x]);
}
void merge(int x, int y) {
fa[find(x)] = find(y);
}
int main() {
cin >> a >> b >> p;
for (int i = a; i <= b; i++) fa[i] = i;
for (int i = 2; i <= b; i++) {
if (!not_prime[i]) not_prime[i] = true, prime[idx++] = i;
for (int j = 0; j < idx && prime[j]*i <= b; j++) {
not_prime[i*prime[j]] = true;
if (i % prime[j] == 0) break;
}
} // 欧拉筛
int res = b - a + 1;
for (int i = 0; i < idx; i++) {
if (prime[i] < p) continue;
int pre = -1;
for (int j = a/prime[i], cut = j*prime[i]; cut <= b; j++, cut = j*prime[i]) {
if (cut < a) continue;
if (pre == -1) {
pre = cut;
continue;
}
if (find(pre) != find(cut))
merge(pre, cut), res--;
pre = cut;
}
} // 枚举
cout << res << endl;
return 0;
}