Home > Baekjoon > 거의 소수

거의 소수
2 초 256 MB 24.209%

출처 : 거의 소수

Solution
Python

import sys
input = sys.stdin.readline
'''
1. 소수인지 확인 (에라토스테네스의 체로 소수 먼저 구하기)
2. 소수라면 계속 곱하면서 나오는 거의 소수들 체크
3. 거의 소수는 pass, 소수 아닌건 넘김
4. 최종 거의 소수 갯수 출력
'''
# 에라토스테네스의 체
def Eratos(B):
    # B의 제곱근까지만 소수인지 체크해도 됨
    l = int(B**(1/2))+1
    lst = [True]*l
    prime = []
    for n in range(2, l):
        if lst[n]:
            c = 2
            while (n*c) < l:
                lst[n*c] = False
                c += 1
            prime.append(n)
    return prime

# 단순히 n제곱하며 A 이상 B 이하인 수를 센다.
def almostPrime(A, B, prime):
    answer = 0
    for n in prime:
        i = 2
        while True:
            k = n**i
            if k > B: break
            if (A <= k <= B):
                answer += 1
            i += 1
    return answer

if __name__ == '__main__':
    A, B = map(int, input().split())
    prime = Eratos(B)
    answer = almostPrime(A, B, prime)
    print(answer)

문제

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

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

입력

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

출력

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

제한

  • 1 ≤ A ≤ B ≤ 1014

예제 입력 1

1 1000

예제 출력 1

25

예제 입력 2

1 10

예제 출력 2

3

예제 입력 3

5324 894739

예제 출력 3

183