1295. Prime Factor Statistics
Given a positive integer N, you need to factorize all integers between (1, N].
Then you have to count the number of the total prime numbers.
Example
input:6
output:7
explain:2=2, 3=3, 4=2*2, 5=5, 6=2*3, the number of prime number : 1+1+2+1+2=7
Notice
1<N<=100000
解法1:DP。总时间复杂度是O(n * sqrt(n))。
class Solution {
public:
/**
* @param N: a number
* @return: the number of prime numbers.
*/
int Count_PrimeNum(int N) {
int result = 0;
vector<int> prime(N + 1, 1); prime[0] = 0; prime[1] = 0;
vector<bool> visited(N + 1, false);
for (int i = 2; i <= N; ++i) {
result += prime[i];
for (int j = 2; i * j <= N && j <= i; ++j) {
if (!visited[i * j]) {
visited[i * j] = 1;
prime[i * j] = prime[i] + prime[j];
}
}
}
return result;
}
};
二刷,不需要visited数组。
class Solution {
public:
/**
* @param N: a number
* @return: the number of prime numbers.
*/
int Count_PrimeNum(int N) {
int result = 0;
vector<int> records(N + 1, 1);
records[0] = 0, records[1] = 0;
for (int i = 2; i <= N; ++i) {
result += records[i];
int count = N / i;
for (int j = 1; j <= count; ++j) {
records[i * j] = records[i] + records[j];
}
}
return result;
}
};
解法2:基于Pollard_Rho算法。因为Pollard_Rho算法时间复杂度O(n^ 1/4),所以总的时间复杂度是O(n^ 5/4)。
class Solution {
public:
/**
* @param N: a number
* @return: the number of prime numbers.
*/
int Count_PrimeNum(int N) {
int result = 0;
vector<int> nums(N + 1, -1);
for (int i = 2; i <= N; ++i) {
result += Pollard_Rho(i);
}
return result;
}
private:
int Pollard_Rho(int n) {
int count = 0;
//vector<int> result;
int sqrtn = sqrt(n);
for (int i = 2; i <= sqrtn;) {
while (n % i == 0) {
count++;
// result.push_back(i);
n /= i;
}
if (i == 2) i += 1;
else i += 2;
}
// if (count == 0) count = 1; // if n is non-2 prime
if (n > 1) count++;
return count;
}
};