同一份代码开O2就RE,关O2就过了??
查看原帖
同一份代码开O2就RE,关O2就过了??
784794
KSS_IS_BIG_SB楼主2023/11/5 11:45

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;
}
2023/11/5 11:45
加载中...