// 5.22 알고리즘 준비
// 백준 거의소수 문제
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
long A = Long.parseLong(st.nextToken());
long B = Long.parseLong(st.nextToken());
int sqrtB = (int) Math.sqrt(B);
boolean[] isNotPrime = new boolean[sqrtB + 1];
List<Integer> primes = new ArrayList<>();
// 에라토스테네스의 체
for (int i = 2; i <= sqrtB; i++) {
if (!isNotPrime[i]) {
primes.add(i);
for (int j = i * 2; j <= sqrtB; j += i) {
isNotPrime[j] = true;
}
}
}
int count = 0;
for (int prime : primes) {
long val = (long) prime * prime; // 최소 k = 2
while (val <= B) {
if (val >= A) {
count++;
}
// 오버플로우 방지
if ((double) val * prime > B) break;
val *= prime;
}
}
System.out.println(count);
}
}
long의 데이터 범위 : -2의 63승부터 2의 63승 -1까지
그래서 교재에 나온대로 풀면
A[i] * temp < Max(B) 이 부등식을 풀고 싶은데 이게 long 범위를 넘어가니까
A[i] < Max(B) / temp 로 풀어야 한다.