Algorithm, Data structure/Solved Algorithmic Problem

BAEKJOON 1016 - 제곱 ㄴㄴ 수

JaykayChoi 2016. 7. 31. 11:45

문제: 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& (<< (number & 7));
}
 
void removeFromSieve(ll number)
{
    number -= minNum;
    sieve[number >> 3&= ~(<< (number & 7));
}
 
void eratosthenes() 
{
    memset(sieve, 255sizeof(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 == ? 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