A number is special if it has exactly 2 proper divisors, i.e., it is the square of a prime (since divisors are 1, p, and p^2). So, for each prime p, p^2 is special. We count all such numbers in [l, r] and subtract from the total.
classSolution {
public:int countNotSpecial(int l, int r) {
int ans = r - l +1;
vector<bool> is_prime(1e6+1, true);
is_prime[0] = is_prime[1] = false;
for (int i =2; i * i <= r; ++i) {
if (is_prime[i]) {
for (int j = i *2; j * j <= r; j += i) is_prime[j] = false;
}
}
for (int i =2; i * i <= r; ++i) {
if (is_prime[i]) {
int sq = i * i;
if (sq >= l && sq <= r) --ans;
}
}
return ans;
}
};
classSolution {
publicintcountNotSpecial(int l, int r) {
int ans = r - l + 1;
boolean[] isPrime =newboolean[1_000_001];
Arrays.fill(isPrime, true);
isPrime[0]= isPrime[1]=false;
for (int i = 2; i * i <= r; ++i) {
if (isPrime[i]) {
for (int j = i * 2; j * j <= r; j += i) isPrime[j]=false;
}
}
for (int i = 2; i * i <= r; ++i) {
if (isPrime[i]) {
int sq = i * i;
if (sq >= l && sq <= r) --ans;
}
}
return ans;
}
}
classSolution {
funcountNotSpecial(l: Int, r: Int): Int {
var ans = r - l + 1val isPrime = BooleanArray(1_000_001) { true }
isPrime[0] = false; isPrime[1] = falsefor (i in2..r) {
if (i * i > r) breakif (isPrime[i]) {
var j = i * 2while (j * j <= r) {
isPrime[j] = false j += i
}
}
}
for (i in2..r) {
if (i * i > r) breakif (isPrime[i]) {
val sq = i * i
if (sq in l..r) ans-- }
}
return ans
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
classSolution:
defcountNotSpecial(self, l: int, r: int) -> int:
ans = r - l +1 is_prime = [True] * (10**6+1)
is_prime[0] = is_prime[1] =Falsefor i in range(2, int(r**0.5) +1):
if is_prime[i]:
for j in range(i*2, int(r**0.5) +1, i):
is_prime[j] =Falsefor i in range(2, int(r**0.5) +1):
if is_prime[i]:
sq = i * i
if l <= sq <= r:
ans -=1return ans
impl Solution {
pubfncount_not_special(l: i32, r: i32) -> i32 {
letmut ans = r - l +1;
letmut is_prime =vec![true; 1_000_001];
is_prime[0] =false;
is_prime[1] =false;
let r_sqrt = (r asf64).sqrt() asi32;
for i in2..=r_sqrt {
if is_prime[i asusize] {
letmut j = i *2;
while j <= r_sqrt {
is_prime[j asusize] =false;
j += i;
}
}
}
for i in2..=r_sqrt {
if is_prime[i asusize] {
let sq = i * i;
if sq >= l && sq <= r {
ans -=1;
}
}
}
ans
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
classSolution {
countNotSpecial(l: number, r: number):number {
letans=r-l+1;
constisPrime= Array(1_000_001).fill(true);
isPrime[0] =isPrime[1] =false;
for (leti=2; i*i<=r; ++i) {
if (isPrime[i]) {
for (letj=i*2; j*j<=r; j+=i) isPrime[j] =false;
}
}
for (leti=2; i*i<=r; ++i) {
if (isPrime[i]) {
constsq=i*i;
if (sq>=l&&sq<=r) --ans;
}
}
returnans;
}
}