알고리즘/백준

[백준 / 소수] 1456 : 거의 소수 (python)

난감 2024. 4. 5. 10:35
728x90

문제 설명

문제

어떤 수가 소수의 N제곱(N ≥ 2) 꼴일 때, 그 수를 거의 소수라고 한다.

두 정수 A와 B가 주어지면, A보다 크거나 같고, B보다 작거나 같은 거의 소수가 몇 개인지 출력한다.

입력

첫째 줄에 왼쪽 범위 A와 오른쪽 범위 B가 공백 한 칸을 사이에 두고 주어진다.

출력

첫째 줄에 총 몇 개가 있는지 출력한다.

제한

  • 1 ≤ A ≤ B ≤ 10^14

예제 입력 1

1 1000

예제 출력 1

25

예제 입력 2

1 10

예제 출력 2

3

예제 입력 3

5324 894739

예제 출력 3

183

풀이

import math

A, B = map(int, input().split())
arr = [0] * (int(math.sqrt(B))+1)
cnt = 0

for i in range(len(arr)):
    arr[i] = i

for i in range(2, int(math.sqrt(len(arr))) + 1): # 얘도 +1 필수
    if arr[i] == 0:
        continue
    for j in range(i+i, len(arr), i): # math.sqrt(B) 까지만 해서 자꾸 오류났음. math.sqrt(B) + 1을 하든지 len(arr)을 해야함.
        arr[j] = 0

for i in range(2, len(arr)):
    if arr[i] != 0:
        temp = i * i
        while temp <= B:
            if temp < A:
                temp *= i
                continue
            temp *= i
            cnt += 1

print(cnt)

 

  • A와 B 사이의 거의 소수를 구하려면, A의 제곱근 ~ B의 제곱근 사이에 있는 소수를 구하고 이 소수의 거의 소수를 구하면 된다.
  • 에라토스테네스의 체를 이용하여 A의 제곱근 ~ B의 제곱근 사이에 있는 소수를 구했다.
    바깥 반복문은 제곱근까지만 검사하면 되므로 B 제곱근의 제곱근까지만 검사하면 된다.

 

 

반응형