누적합으로 구간합 구하면 된다. 대신 시작을 어디서 하냐에 따라서 결과가 두 종류로 나눠지기 때문에


홀수항에서 시작하는 배열과 짝수항에서 시작하는 배열을 만든다.


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
#include <stdio.h>
using namespace std;
 
typedef long long ll;
int p[100001], ind[100001], cnt, d[2][100001];
 
int main() {
    ind[2= ++cnt;
    p[2= 2;
    for (ll i = 3; i < 100000; i += 2) {
        if (p[i]) continue;
        p[i] = 2;
        ind[i] = ++cnt;
        for (ll j = i * i; j < 100000; j += 2 * i)
            p[j] = 1;
    }
    
    for (int i = 1, flag = 1; i <= 100000; i++) {
        if (!ind[i]) ind[i] = ind[i - 1];
        d[0][i] = d[0][i - 1]; d[1][i] = d[1][i - 1];
        if (p[i] == 2) {
            d[1 - flag][i] += i * 3;
            d[flag][i] -= i;
            flag = 1 - flag;
        }
    }
    int n, a, b, flag;
    scanf("%d"&n);
    while (n--) {
        scanf("%d%d"&a, &b);
        if (p[a] == 2) a--;
        flag = ind[a] % 2;
        printf("%d\n", d[flag][b] - d[flag][a]);
    }
    return 0;
}
cs


'BOJ' 카테고리의 다른 글

2841 외계인의 기타 연주  (0) 2018.02.17
3986 좋은 단어  (0) 2018.02.17
14942 개미  (0) 2018.02.17
15270 친구 팰린드롬  (0) 2018.02.17
15271 친구 팰린드롬 2  (0) 2018.02.17

+ Recent posts