Untitled
Anonymous
c_cpp
02/28/2026 11:11 PM
1.7 KB
21
Indexable
vector<int> count_divisors_linear(int n) {
vector<int> divisors(n + 1);
vector<int> primes;
vector<int> min_prime(n + 1, 0);
vector<int> exponent_count(n + 1, 0); // Count of the smallest prime factor in i
divisors[1] = 1;
for (int i = 2; i <= n; ++i) {
if (min_prime[i] == 0) {
min_prime[i] = i;
primes.push_back(i);
divisors[i] = 2; // A prime has 2 divisors: 1 and itself
exponent_count[i] = 1; // p^1
}
for (int p : primes) {
if (p > min_prime[i] || i * p > n) break;
min_prime[i * p] = p;
if (min_prime[i] == p) {
// If p is already the smallest prime factor of i
// (a+1) becomes (a+2) -> we divide by (a+1) and multiply by (a+2)
exponent_count[i * p] = exponent_count[i] + 1;
divisors[i * p] = divisors[i] / (exponent_count[i] + 1) * (exponent_count[i * p] + 1);
} else {
// If p is a new, smaller prime factor
exponent_count[i * p] = 1;
divisors[i * p] = divisors[i] * 2; // (a_1+1)... * (1+1)
}
}
}
return divisors;
}Editor is loading...
Leave a Comment