티스토리 뷰
728x90
문제 링크
풀이
모든 소수는 양수이므로 투 포인터를 적용할 수 있습니다. i, j를 꿈틀꿈틀하게 움직여줍시다.
sum + primes[j]가 n 이하이면 sum에 primes[j]를 더해주고 j를 증가, n보다 크면 primes[i]를 빼고 i를 증가시켜줍니다.
정답 코드
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vi = vector<int>;
using vb = vector<bool>;
vi primes;
int n;
void init() {
vb isPrime(4'444'444, true);
isPrime[1] = isPrime[0] = false;
for (ll i = 2; i < 4'444'444; i++) {
if (isPrime[i]) {
primes.push_back(i);
for (ll j = i * i; j < 4'444'444; j += i) {
isPrime[j] = false;
}
}
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
init();
cin >> n;
int sum = 0;
int ans = 0;
for (int i = 0, j = 0; j < primes.size();) {
if (sum + primes[j] <= n) {
sum += primes[j++];
} else {
sum -= primes[i++];
}
if (sum == n)ans++;
}
cout << ans;
}
728x90
'알고리즘 > 문제 풀이' 카테고리의 다른 글
[BOJ] 백준 1799 비숍 (0) | 2021.03.08 |
---|---|
[BOJ] 백준 1647 도시 분할 계획 (0) | 2021.03.08 |
[BOJ] 백준 1562 계단 수 (0) | 2021.03.07 |
[BOJ] 백준 10844 쉬운 계단 수 (0) | 2021.03.07 |
[BOJ] 백준 1516 게임 개발 (0) | 2021.03.07 |
댓글