AC

许诺  •  14天前


#include <iostream>
#include <vector>

using namespace std;

vector getPrimesUpTo(int n) {

vector<bool> isPrime(n + 1, true);
isPrime[0] = isPrime[1] = false;
for (int i = 2; i * i <= n; ++i) {
    if (isPrime[i]) {
        for (int j = i * i; j <= n; j += i) {
            isPrime[j] = false;
        }
    }
}
vector<int> primes;
for (int i = 2; i <= n; ++i) {
    if (isPrime[i]) {
        primes.push_back(i);
    }
}
return primes;

}

int countPrimeFactors(int num, const vector& primes) {

int count = 0;
for (int prime : primes) {
    if (prime * prime > num) break;
    while (num % prime == 0) {
        count++;
        num /= prime;
    }
}
if (num > 1) {
    count++;
}
return count;

}

int main() {

int n;
cin >> n;

// The maximum possible number of prime factors for any number <=n is log2(n), but for safety, sieve up to n.
int maxPossibleCount = n; // Though in practice, much smaller.
vector<int> primes = getPrimesUpTo(n);
vector<bool> isPrimeSieve(maxPossibleCount + 1, true);
isPrimeSieve[0] = isPrimeSieve[1] = false;
for (int i = 2; i * i <= maxPossibleCount; ++i) {
    if (isPrimeSieve[i]) {
        for (int j = i * i; j <= maxPossibleCount; j += i) {
            isPrimeSieve[j] = false;
        }
    }
}

for (int i = 2; i <= n; ++i) {
    int cnt = countPrimeFactors(i, primes);
    if (cnt >= 2 && isPrimeSieve[cnt]) {
        cout << i << endl;
    }
}

return 0;

}


评论:

请先登录,才能进行评论