1^14 의 square root 는 1^7이다.
1^7까지의 소수만 구해주면 된다.
그래서 2~1^7까지의 소수를 구하고,
#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 |