※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 15897번 문제인 잘못 구현한 에라토스테네스의 체이다.
문제는 아래 링크를 확인하자.

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

 

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

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

www.acmicpc.net

문제를 정리하면, 각 i에 대하여 맨 처음의 1을 제외하면 (N-1)/i 번의 연산을 하게 됨을 알 수 있다.

i의 범위를 큰 수들과 작은 수의 모임으로 둘로 나눠, 큰 수들의 모임에서는 같은 횟수의 연산을 하게 되는 숫자들을 모아 계산하고 작은 범위의 숫자들은 하나씩 직접 나눠 계산하는 방식으로 문제를 해결하자.

 

글쓴이는 10만을 기준으로 잡아 큰 수와 작은 수를 나누었다.

 

아래는 제출한 소스코드이다.

#include <iostream>
using namespace std;
typedef long long ll;

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	ll ans = 0;
	ll N; cin >> N; ans += N; N--;
	int num = 1;
	while (N / num > 100000) {
		ans += num * (N / num - N / (num + 1));
		num++;
	}
	ll R = N / num;
	for (ll i = 1; i <= R; i++) {
		ans += N / i;
	}

	cout << ans;
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 9359 // C++] 서로소  (0) 2021.11.18
[BOJ 11689 // C++] GCD(n, k) = 1  (0) 2021.11.17
[BOJ 15907 // C++] Acka의 리듬 세상  (0) 2021.11.15
[BOJ 16936 // C++] 나3곱2  (1) 2021.11.14
[BOJ 2023 // C++] 신기한 소수  (0) 2021.11.13

+ Recent posts