Medium
You are given 2 positive integers l
and r
. For any number x
, all positive divisors of x
except x
are called the proper divisors of x
.
A number is called special if it has exactly 2 proper divisors. For example:
Return the count of numbers in the range [l, r]
that are not special.
Example 1:
Input: l = 5, r = 7
Output: 3
Explanation:
There are no special numbers in the range [5, 7]
.
Example 2:
Input: l = 4, r = 16
Output: 11
Explanation:
The special numbers in the range [4, 16]
are 4 and 9.
Constraints:
1 <= l <= r <= 109
import kotlin.math.sqrt
class Solution {
fun nonSpecialCount(l: Int, r: Int): Int {
val primes = sieveOfEratosthenes(sqrt(r.toDouble()).toInt())
var specialCount = 0
for (prime in primes) {
val primeSquare = prime.toLong() * prime
if (primeSquare in l..r) {
specialCount++
}
}
val totalNumbersInRange = r - l + 1
return totalNumbersInRange - specialCount
}
private fun sieveOfEratosthenes(n: Int): List<Int> {
val isPrime = BooleanArray(n + 1)
for (i in 2..n) {
isPrime[i] = true
}
var p = 2
while (p * p <= n) {
if (isPrime[p]) {
var i = p * p
while (i <= n) {
isPrime[i] = false
i += p
}
}
p++
}
val primes: MutableList<Int> = ArrayList()
for (i in 2..n) {
if (isPrime[i]) {
primes.add(i)
}
}
return primes
}
}