반응형

문제 출처 :


https://www.acmicpc.net/problem/2581



알고리즘 분석 :


문제 해결에 필요한 사항

1. 에라토스테네스의 체

2. 비트 마스크

3. 비트 마스크를 이용한 에라토스테네스의 체 :: http://www.crocus.co.kr/593


위의 링크에 나오는 비트 마스크를 이용한 에라토스테네스의 체를 이용하여 정답을 도출한다.


   isPrime(i) ? sum += i, (min == -? min = i : ) : 0;

의 의미는


if(isPrime(i) == 1)

{

sum += i;


if(min == -1)

min = i;

}

와 동일하다.





소스 코드 : 

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
#include <iostream>
#include <cstdio>
#include <memory.h>
#include <math.h>
 
#define MAX_N 10001
 
using namespace std;
 
unsigned char sieve[(MAX_N + 7/ 8];
 
// K가 소수인지 확인한다.
inline bool isPrime(int k)
{
    return sieve[k >> 3& (<< (k & 7));
}
 
// k가 소수가 아니라고 표시한다.
inline void setComposite(int k)
{
    sieve[k >> 3&= ~(<< (k & 7));
}
 
// 비트 마스크를 사용하는 에라토스테네스의 체의 구현
// 이 함수를 수행하고 난 뒤, isPrime()을 이용해 각 수가 소수인지 알 수 있다.
void eratosthenes(int n)
{
    memset(sieve, 255sizeof(sieve));
    setComposite(0);
    setComposite(1);
 
    int sqrtn = int(sqrt(n));
    for (int i = 2; i <= sqrtn; ++i)
        // 이 수가 아직 지워지지 않았다면
        if (isPrime(i))
            // i의 배수 j들에 대해 isPrime[i] = false로 둔다.
            // i*i 미만의 배수는 이미 지워졌으므로 신경 쓰지 않는다.
            for (int j = i*i; j <= n; j += i)
                setComposite(j);
}
 
int main()
{
    int n,m;
 
    scanf("%d %d"&m, &n);
    eratosthenes(n);
 
    int min = -1, sum = 0;
 
    for (int i = m; i <= n; i++)
        isPrime(i) ? sum += i, (min == -? min = i : ) : 0;
 
    printf("%d\n%d", sum, min);
    
    return 0;
}
 
//                                                       This source code Copyright belongs to Crocus
//                                                        If you want to see more? click here >>
Crocus


반응형

'Applied > 알고리즘 문제풀이' 카테고리의 다른 글

[1644번] 소수의 연속합  (0) 2017.02.14
[1806번] 부분합  (0) 2017.02.13
[11377번] 열혈강호 3  (4) 2017.02.10
[11376번] 열혈강호 2  (0) 2017.02.10
[11375번] 열혈강호  (3) 2017.02.10