에라토스테네스의 체 문제이다
만약, "min에서 max까지 순회하면서 각 값이 2~백만의 값의 제곱수로 나누어 떨어질경우 pass"
하는 식으로 알고리즘을 짜면 n^2이 되기때문에 시간초과가 난다.
따라서 백만짜리 배열을 선언하고
#
"i"는 2~max까지 순회하며 다음을 반복
##
(i*i) * j 는 제곱 YES수이므로
배열[(i*i) * j]를 true로 바꾼다.
다만 (i*i) * j의 값을 min~max 사이로 해싱한다 민다
j+=1.
##
#
마지막에 배열에서 false가 몇개인지 샌다
#
와 같은 알고리즘은 배열의 값을 중복해서 체크하는 경우가 거의 없기 때문에
시간복잡도를 n으로 봐도 되므로(즉, 백만) 시간 안에 해결 가능하다.
#include <iostream>
using namespace std;
bool isSqr[1000001];
int main() {
long long min, max;
cin >> min >> max;
for (long long i = 2; i * i <= max; i++) {
long long start = min / (i * i);
if (start * i * i != min) start++;
for (long long j = start; i * i * j <= max; j++) {
isSqr[i * i * j - min] = true;
}
}
int count = 0;
for (int i = 0; i < max - min + 1; i++) {
if (!isSqr[i]) count++;
}
cout << count << endl;
return 0;
}
'코딩 > 알고리즘' 카테고리의 다른 글
[python3] 백준 1786 찾기 (0) | 2018.01.12 |
---|---|
백준 1015 수열 정렬 (0) | 2018.01.10 |
백준 10217 KCM Travel (0) | 2018.01.08 |
백준 11657 타임머신 (0) | 2018.01.08 |
백준 1865 웜홀 (0) | 2018.01.08 |