Notice
Recent Posts
Recent Comments
Link
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

전공공부

[BOJ_1456] 거의 소수 본문

Study/Problem Solving

[BOJ_1456] 거의 소수

monitor 2023. 12. 2. 18:09

설명


계속 시간 초과가 나길래 prime을 항상 범위의 수를 탐색 할 때 마다 구하고 있었다 처음에는... 상당히 버거운 코드 였고 이를 개선하여 1차적으로 prime 배열을 두고 항상 사용하였고 이후에는 Long 범위가 넘어 갈 때 대처가 잘 안 되어서 while문 내부에서 오버플로가 나길래 num > Long.MAX_VALUE / (i -> 소수 값) 을 넣어서 구할 수 있었다.

 

코드


package Math;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.Set;
import java.util.StringTokenizer;

public class BOJ_1456 {
    static Set<Long> set;
    static boolean[] isPrime;

    public static void main(String[] args) throws Exception {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

        StringTokenizer tk = new StringTokenizer(in.readLine(), " ");

        long A = Long.parseLong(tk.nextToken());
        long B = Long.parseLong(tk.nextToken());

        set = new HashSet<>();
        isPrime = new boolean[(int) Math.sqrt(B) + 1];

        getPrime();

        for (long i = 2; i * i <= B; i++) {
            if (isPrime[(int) i]) {
                long num = i * i;
                while (num <= B) {
                    if (num >= A) {
                        set.add(num);
                    }
                    if (num > Long.MAX_VALUE / i) {
                        break;
                    }
                    num *= i;
                }
            }
        }

        System.out.println(set.size());
    }

    private static void getPrime() {
        for (int i = 2; i < isPrime.length; i++) {
            isPrime[i] = true;
        }

        for (int i = 2; i * i < isPrime.length; i++) {
            if (isPrime[i]) {
                for (int j = i * i; j < isPrime.length; j += i) {
                    isPrime[j] = false;
                }
            }
        }
    }
}
 

1456번: 거의 소수

어떤 수가 소수의 N제곱(N ≥ 2) 꼴일 때, 그 수를 거의 소수라고 한다. 두 정수 A와 B가 주어지면, A보다 크거나 같고, B보다 작거나 같은 거의 소수가 몇 개인지 출력한다.

www.acmicpc.net

 

'Study > Problem Solving' 카테고리의 다른 글

[BOJ_1990] 소수인 팰린드롬  (1) 2023.12.04
[BOJ_1669] 멍멍이 쓰다듬기  (1) 2023.12.03
[BOJ_2824] 최대공약수  (1) 2023.12.01
[BOJ_9421] 소수 상근수  (1) 2023.11.30
[BOJ_2168] 타일 위의 대각선  (1) 2023.11.29