许诺 • 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;
}
评论:
请先登录,才能进行评论