소수를 구하고 누적합과 투포인터를 사용하면 쉽게 풀 수 있는 문제이다.
소수를 효과적으로 구하는 방법을 찾아 보니 에라토스테네스의 체라는 방법이 있었다.
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n;
cin >> n;
if (n <= 1) {
cout << 0;
return 0;
}
vector<bool> Pri(n + 1, true);
Pri[0] = Pri[1] = false;
for (int i = 2; i * i <= n; i++) {
if (Pri[i]) {
for (int j = i * i; j <= n; j += i) {
Pri[j] = false;
}
}
}
vector<int> sums;
sums.push_back(0);
for (int i = 2; i <= n; i++) {
if (Pri[i]) {
sums.push_back(sums.back() + i);
}
}
int s = 0, e = 0;
int cnt = 0;
while (e < sums.size()) {
int sum = sums[e] - sums[s];
if (sum == n) {
cnt++;
e++;
} else if (sum < n) {
e++;
} else {
s++;
}
}
cout << cnt;
return 0;
}