Computing $w(n)$ : How many integer in range$ 1..n$ have distinct prime divisor equals to k.

152 Views Asked by At

$ ω(n) $ is the number of distinct prime divisor of $n$. Here I am trying to find how many integer in given range $ 1, \ldots, n $ have $ ω(n) = K $. Constraints given on $n$ is $ n \le 10^{12} $.

I can easily compute $ ω(n)$ for $n \le 10^{8}$ in $O (n \log \ n) $ .

Below code can compute distinct prime divisors in $ O(n \log \ n) $.

How to compute when $ n \le 10^{12} $

void genPrimes(){
    vector<bool>isPrimes(MAX,1);
    for(int i=2;i*i<MAX;i++){
        if(isPrimes[i]){
            for(int j=i;i*j<MAX;j++) isPrimes[i*j]=0;
        }
    }
 
    primes.push_back(2);
    for(int i=3;i<MAX;i+=2){
        if(isPrimes[i])primes.push_back(i);
    }
}
 
 
 
void genDistPrimeFactors(){
    for(int i=0;primes[i]<1000001;i++){
        for(int j=2*primes[i];j<1000001;j+=primes[i]){
            divs[j]+=1;
        }
    }
}