求 hack or 卡常
查看原帖
求 hack or 卡常
1475943
libu2333楼主2025/8/28 18:30

rt,乱搞了一个不用筛法的做法。已经过了,但是过极端数据还是有点难。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

int p[50000005], num[10000005];

bool isprime(int n) {
    if (p[n] != 0) {
        return p[n] == 2;
    }
    if (n <= 1) {
        p[n] = 1;
        return false;
    }
    if (n == 2 || n == 3) {
        p[n] = 2;
        return true;
    }
    if (n % 2 == 0) {
        p[n] = 1;
        return false;
    }
    for (int j = 3; j * j <= n; j += 2) {
        if (n % j == 0) {
            p[n] = 1;
            return false;
        }
    }
    p[n] = 2;
    return true;
}

int N, M, maxn = 0;

void dfs(int dep) {
    int base = 1 << dep;
    for (int i = 3;; i += 2) {
        if (isprime(i)) {
            if (base * i >= N && base * i <= M) {
                cout << dep + 1;
                return;
            } else if (base * i > M) {
                dfs(dep - 1);
                return;
            }
        }
    }
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    N=(1<<22)+1,M=(1<<21)*3-1;
    int thresold = M - N + 1;
    cin >> N >> M;
    if (M - N + 1 <= thresold) {
        for (int i = 2; i <= M; ++i) {
            if (isprime(i)) {
                num[i] = 1;
            } else {
                if (i % 2 == 0) {
                    num[i] = num[2] + num[i / 2];
                } else {
                    for (int j = 3; j * j <= i; j += 2) {
                        if (i % j == 0) {
                            num[i] = num[j] + num[i / j];
                            break;
                        }
                    }
                }
            }
        }
        for (int i = N; i <= M; ++i) {
            if (num[i] > maxn) {
                maxn = num[i];
            }
        }
        cout << maxn;
        return 0;
    }
    int k = static_cast<int>(log2(M));
    if ((1 << k) >= N) {
        cout << k;
        return 0;
    } else {
        dfs(k - 1);
    }
}

回复请 @ 我。看情况玄关。感激不尽

2025/8/28 18:30
加载中...