(에라토스테네스의 체 + 투 포인터)

에라토스테네스의 체로 소수 구해주고, 투 포인터로 만약 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;
}