📦1644: 소수의 연속합
[알고리즘 풀이] 강동규
Reviewed by Kade Kang (devkade12@gmail.com)
Reviewed:: 2024-02-20
문제 확인하기
풀이
- 연속된 소수의 합으로 목표값을 만드는 방식이기 때문에 소수를 먼저 구해 vector 안에 저장한다.
- 투포인터 방식으로 늘리고 줄이면서 목표값에 도달하는 경우 res++ 을 통해서 목표값을 만들 수 있는 횟수를 구한다.
#include <iostream>
#include <vector>
#define endl '\n'
using namespace std;
int n, sum=0, res;
vector<int> vec;
void Input(){
cin >> n;
if(n == 1){
cout << 0 << endl;
exit(0);
}
}
void eratos(int n){
vector<int> prime(n+1, 1);
for(int i=2; i*i<=n; ++i){
if(prime[i]){
for(int j=i*i; j<=n; j+=i){
prime[j] = 0;
}
}
}
for(int i=2; i<=n; ++i){
if(prime[i]) vec.push_back(i);
}
}
void Solution(){
eratos(n);
int start = 0;
int end = 0;
res = 0;
while(start<=end && end<=vec.size()){
if(sum < n){
sum+=vec[end];
end++;
}
else{
sum-=vec[start];
start++;
}
if(sum == n) res++;
}
cout << res << endl;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
Input();
Solution();
return 0;
}