image.png

// 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 로 풀어야 한다.