I thought of solving it using segmented sieve. Like first I’ll calculate the prime factorisation of each number from l to r , then for each i’ll just multiply their powers of prime factor to get the total no. of factors of that number.
if total factors==3 then i’ll increament the ans else continue with the rest.
Can this approach be accepted? Or is there any better approach to solve it?
A couple of observations here can lead you to the solution.
First, factors of a number always exist in pairs. So the only case when the number of factors are odd is when there exists a pair in which both the numbers are same, that is, the number is a perfect square.
Also, since the resulting number also doesn’t have any other factors, it must be the square of a prime.
So you use a segmented sieve to generate primes till sqrt(1000000000000) = 10^6 and use it in all the queries to count the number of primes in the appropriate range.
2 Likes
in the same procedure of segment sieve create an array of vectors and make a look up table for each number(i.e for 6 factors are 1 2 3 and for 30 5*6 and 6 will return a vector of
size 3 which contains 1 2 3) while iterating through this array if you find the size of the vector corresponding to that index using unordered_map for the look up table might reduce the time complexity and decrease number of iteration
1 Like
thankyou so much , it helps me in revising some basic theory of numbers.
bro I tried this approach but where I’m going wrong? Could you please point out the mistake in my code- https://ideone.com/1XJSe9
In line 24, set
lli n = sqrt(i);
and it should work, although I’m almost sure it will TLE 
See if you can optimise the search for count of such primes.
Hint
Precompute a sorted list of primes, use binary search to find the primes within range sqrt(l) and sqrt(r) for each query. This reduces the complexity of each query from O(N) (where N is r - l + 1) to O(log(n)) (where n is the number of primes till 10^6)