문제: https://www.acmicpc.net/problem/1016
시간 복잡도를 줄이기위해 에라토스테네스의 체 방법을 사용해야했고, 공간 복잡도를 줄이기 위해 bit mask 방법과 주어진 최소값부터 에라토스테네스의 체를 적용하는 방법을 사용해 풀었습니다.
my solving
c++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | #include <fstream> #include <iostream> #include <algorithm> #include <cstring> using namespace std; typedef long long ll; const ll MAX_N = 1000003; unsigned char sieve[(MAX_N + 7) / 8]; ll minNum, maxNum; bool isSquareNNNumber(ll number) { number -= minNum; return sieve[number >> 3] & (1 << (number & 7)); } void removeFromSieve(ll number) { number -= minNum; sieve[number >> 3] &= ~(1 << (number & 7)); } void eratosthenes() { memset(sieve, 255, sizeof(sieve)); ll maxNumSqrt = ll(sqrt(maxNum)); ll num = 1; while (true) { num++; if (num > maxNumSqrt) break; ll i = num * num; for (ll j = minNum % i == 0 ? minNum : (ll)(minNum / i) * i + i; j <= maxNum; j += i) { if (j >= minNum) removeFromSieve(j); } } } int main() { cin >> minNum >> maxNum; eratosthenes(); int ret = 0; for (ll i = minNum; i <= maxNum; i++) { if (isSquareNNNumber(i)) ret++; } cout << ret << endl; return 0; } | cs |
'Algorithm, Data structure > Solved Algorithmic Problem' 카테고리의 다른 글
BAEKJOON 1018 - 체스판 다시 칠하기 (0) | 2016.08.02 |
---|---|
BAEKJOON 1017 - 소수 쌍 (0) | 2016.08.01 |
BAEKJOON 1015 - 수열 정렬 (0) | 2016.07.29 |
BAEKJOON 1014 - 컨닝 (0) | 2016.07.29 |
BAEKJOON 1012 - 유기농 배추 (0) | 2016.07.26 |