1^14 의 square root 는 1^7이다.
1^7까지의 소수만 구해주면 된다.
그래서 2~1^7까지의 소수를 구하고,
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <cstdio> | |
/** | |
* https://www.acmicpc.net/problem/1456 | |
* BOJ 백준온라인져지 1456 거의 소수 풀이 | |
*/ | |
int main(){ | |
long long min, max; | |
int count = 0; | |
scanf("%lld%lld", &min, &max); | |
bool *isPrimeNumber = new bool[(int)1e+7 + 1]; | |
int *primeNumber = new int[(int)1e+7 + 1]; | |
int cnt = 0; | |
for(long long i = 2; i * i <= max ; i++){ | |
if(!isPrimeNumber[i]){ | |
for(long long j = i * 2; j * j <= max; j += i) isPrimeNumber[j] = true; | |
primeNumber[cnt++] = i; | |
} | |
} | |
for(int i = 0; i < cnt; i++){ | |
long long n = primeNumber[i]; | |
while(primeNumber[i] <= max / n){ | |
if(primeNumber[i] * n >= min) count++; | |
n *= primeNumber[i]; | |
} | |
} | |
printf("%d", count); | |
} |
primeNumber에 소수들을 넣어준다.
primeNumber에 들어간 소수들로
max => n * primeNumber[i]를 계산해준다.
여기서 주의해야 될 점이 n이 long long을 넘어가는 경우다.
하지만 이항을 해서
max / n >= primeNumber[i]로 변경할 수 있다.
그리고 min >=의 경우를 구해야줘야 되는데, 이미 while loop에서 체크를 해줘서 밑에서는 체크를 안해줘도 된다.
'IT > 알고리즘' 카테고리의 다른 글
BOJ 백준온라인져지 2206 벽 부수고 이동하기 풀이 (0) | 2017.12.15 |
---|---|
BOJ 백준온라인져지 14923 미로탈출 풀이 (0) | 2017.12.15 |
BOJ 백준온라인져지 14921 용액 합성하기 풀이 (0) | 2017.12.14 |
BOJ 백준온라인져지 2530 인공지능 시계 풀이 (0) | 2017.12.14 |
BOJ 백준온라인져지 2525 오븐 시계 풀이 (0) | 2017.12.14 |