PS/Baekjoon Online Judge

[백준 15897] 잘못 구현한 에라토스테네스의 체 [C]

kimyoungrok 2021. 9. 2. 03:41

백준 - 15897


풀이

6번 줄의 실행 횟수에 따른 결과는 다음과 같다.

i j sum
1 1 2 3 4 5 6 7 8 9 10 11 12 12
2 1 3 5 7 9 11 6
3 1 4 7 10 4
4 1 5 9 3
5 1 6 11 3
6 1 7 2
7 1 8 2
8 1 9 2
9 1 10 2
10 1 11 2
11 1 12 2
12 1 1

일반적으로 1~n까지의 수에 대해서 sum += (n-1)/i + 1이 성립한다.

하지만 시간초과가 발생하므로 모든 수에 대해 확인하지 않고, n의 약수에 대해서만 확인하는 방법이 필요했다.

 

n의 약수(prime)에 대응하는 개수(temp)는 다음과 같이 구할 수 있다.

for (int i = 2, temp; i < n; i = temp+1)
    temp = (n-1) / ((n-1)/i);

소스코드

#include <stdio.h>
int main(){
    int n;
    scanf("%d", &n);
    long long sum = n;
    for (int i = 2, temp; i < n; i = temp+1){
        int prime = (n - 1)/i + 1;
        temp = (n-1) / ((n-1)/i);
        sum += prime*(temp -i +1);
    }
    printf("%lld", sum + (n > 1 ? 1 : 0));
}

출처 및 참고자료

 

15897번: 잘못 구현한 에라토스테네스의 체

성원이는 오늘 이산수학 수업 시간에 에라토스테네스의 체에 대해 배웠다. 에라토스테네스의 체는 고대 그리스 수학자 에라토스테네스가 발견한 소수를 찾는 방법이다. 성원이는 이 방법에 너

www.acmicpc.net

 

Harmonic-Lemma

약수를 세는 것 보다 배수를 세는 게 쉽다.

ahgus89.github.io

'PS > Baekjoon Online Judge' 카테고리의 다른 글

[백준 2143] 두 배열의 합 [C]  (0) 2021.09.02
[백준 5347] LCM [C]  (0) 2021.09.02
[백준 1188] 음식 평론가 [C]  (0) 2021.09.02
[백준 2436] 공약수 [C]  (0) 2021.09.01
[백준 1987] 알파벳 [C]  (0) 2021.09.01