PHP Count Semi Primes
function countSemiPrimes(int $n, array $p, array $q): array
{
$primes = array_fill(0, $n + 1, true);
$semiPrimes = array_fill(0, $n + 1, 0);
$semiPrimeCounts = array_fill(0, count($p), 0);
for ($i = 2; $i * $i <= $n; $i++) {
if ($primes[$i]) {
for ($k = $i * $i; $k <= $n; $k += $i) {
$primes[$k] = false;
}
}
}
for ($k = 2; $k * $k <= $n; $k++) {
if ($primes[$k]) {
for ($i = 2; $i * $k <= $n; $i++) {
if ($primes[$i]) {
$semiPrimes[$k * $i] = 1;
}
}
}
}
for ($i = 1; $i <= $n; $i++) {
$semiPrimes[$i] += $semiPrimes[$i - 1];
}
foreach ($p as $k => $v) {
$semiPrimeCounts[$k] = $semiPrimes[$q[$k]] - $semiPrimes[$v - 1];
}
return $semiPrimeCounts;
}
This precomputes semiprimes and prefix sums so each range query becomes a quick subtraction.