(에라토스테네스의 체 + 투 포인터)
에라토스테네스의 체로 소수 구해주고, 투 포인터로 만약 N보다 작거나 같으면 PrimeNums[End] 더해주고 End++ , N보다 크면 PrimeNums[Start] 빼주고 Start++ .
#include<iostream>
#include<vector>
using namespace std;
const int MAX_N = 4000000;
bool IsPrime[MAX_N + 1];
int N;
vector<int> PrimeNums;
int Answer = 0;
void GetPrimeNums()
{
for (int i = 2; i * i <= N; ++i)
{
for (int j = 2; i * j <= N; ++j)
{
IsPrime[i * j] = false;
}
}
for (int i = 2; i <= N; ++i)
{
if (IsPrime[i]) PrimeNums.push_back(i);
}
}
void GetAnswer()
{
int Start = 0, End = 0;
int Sum = 0;
while (true)
{
if (Sum > N)
{
Sum -= PrimeNums[Start++];
}
else if (End == PrimeNums.size())
{
break;
}
else
{
Sum += PrimeNums[End++];
}
if (Sum == N) Answer++;
}
}
int main()
{
ios::sync_with_stdio(false), cin.tie(0);
cin >> N;
fill_n(IsPrime, N + 1, true);
GetPrimeNums();
GetAnswer();
cout << Answer;
return 0;
}