#14941: 호기심
문제
https://www.acmicpc.net/problem/14941
#14941: 호기심
질문 수 n은 첫 번째 줄에 지정됩니다. 다음 줄부터 함수의 입력 a와 b가 차례로 지정됩니다. (1 ≤ a ≤ b ≤ 105) 남규는 호기심이 많아서 질문을 많이 한다. 따라서 질문의 수는 n
www.acmicpc.net
설명
규칙에 따라 a보다 크고 b보다 작은 소수를 계산하는 것은 간단한 문제입니다. 먼저 에라토스테네스의 체를 사용하여 10^5보다 작은 소수를 걸러냅니다. 소수가 하나보다 큰지 여부를 비교하는 방법은 O(N)의 시간 복잡도를 가지며, 10^5보다 작은 소수가 41,000개 이상 있고 테스트 케이스의 수 N이 10^5이므로 시간이 초과됩니다. 따라서 프라임 배열이 이미 정렬되어 있으므로 O(logN)의 시간 복잡도를 갖는 이진 검색을 사용했습니다.
C++ STL 하한그리고 상한 함수를 사용하여 a보다 큰 요소가 먼저 발견되는 반복자를 찾고 b보다 큰 요소가 먼저 나타나는 반복자를 각각 s와 e로 찾습니다. s에서 e까지의 각 값은 for 문으로 참조되었습니다. 이제 홀수 연산의 경우 3을 곱하고 더하고 짝수 연산의 경우 -1을 곱하고 더합니다.
암호
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
int n;
cin >> n;
vector<int> sieve(500001, 1), prime;
for (int i = 2; i <= 500000; i++)
if (sieve(i)) {
prime.push_back(i);
for (int j = i * 2; j <= 500000; j += i)
sieve(j) = 0;
}
while (n--) {
int a, b, cnt = 1, ans = 0;
cin >> a >> b;
auto s = lower_bound(prime.begin(), prime.end(), a);
auto e = upper_bound(prime.begin(), prime.end(), b);
for (auto it = s; it != e; it++, cnt++)
if (cnt % 2)
ans += 3 * *it;
else
ans -= *it;
cout << ans << '\n';
}
return 0;
}
![[백준] 15655번: N과 M [백준] 15655번: N과 M](https://last.issue-news.com/wp-content/plugins/contextual-related-posts/default.png)