백준 1644 소수의 연속합

치즈·2022년 12월 14일

BOJ

목록 보기
28/45

에라토스테네스의 체 구해놓기 -- isPrime()
에라토스테네스의 체로 구해놓은 소수들을 벡터에 저장하기 -- getPrimes()

두 포인터를 이용해서 벡터에 저장해 놓은 소수를 스캔?하기 -- solve()

#include <iostream>
#include <vector>
#include <cmath>
using namespace std;

int N;
int cnt = 0;
vector<int> primes;
vector<int> v;
void input(){
  cin >> N;
  v.resize(N+1);
}

void isPrime(){
  for(int i = 2; i <= int(sqrt(N)); i++){
    if(v[i] != 0) continue;
    for(int j = 2 * i; j <= N; j+= i){
      v[j] = 1;
    }
  }
}

void getPrimes(){
  for(int i = 2; i <= N; i++){
    if(!v[i]){
      primes.push_back(i);
    }
  }
}


void solve(){
  int l = 0; 
  int r = 0;
  int primeSum = 0;
  while(true){
    if(primeSum >= N){
      primeSum -= primes[l];
      l++;
    }
    else if(r == primes.size()) break;
    else{
      primeSum += primes[r];
      r++;
    }

    if (primeSum == N) cnt++;
  }
  cout << cnt;

}

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  input();
  isPrime();
  getPrimes();
  solve();
  return 0;
}

profile
차근차근 배워나가요

0개의 댓글