May 18, 2021 ( last updated : May 18, 2021 )
투 포인터
알고리즘
https://github.com/sneakstarberry/
[백준] 1644번 소수의 연속합
소수들을 먼저 구해줘야한다. N의 범위는 4000000까지가 최대이므로 40000000까지 에라토스테네스의 체 알고리즘을 통해서 소수들을 구해서 벡터 넣어둔다.
이후 low, high 두 수를 통해서 벡터 상에서 더해주는 값들의 시작 점과 끝 지점을 표현해 준다. 하나씩 이동하면서 벡터 내의 값들을 더하거나 빼면서 경우의 수를 카운트 해준다.
#include <algorithm>
#include <iostream>
#include <vector>
#define MAX (4000000 + 100)
using namespace std;
int N;
vector<int> prime;
long long numbers[MAX];
void set_prime_numbers() {
for (long long i = 2; i < MAX; i++) {
numbers[i] = i;
}
for (long long i = 2; i < MAX; i++) {
if (numbers[i] == 0)
continue;
for (long long j = i * i; j < MAX; j += i) {
if (j > MAX)
continue;
numbers[j] = 0;
}
}
for (long long i = 2; i < MAX; i++) {
if (!(numbers[i] == 0)) {
prime.push_back(i);
}
}
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> N;
set_prime_numbers();
int low = 0, high = 0;
int sum = prime[0];
int cnt = 0;
while (low <= high && prime[high] <= N) {
if (sum < N) {
sum += prime[++high];
} else if (sum == N) {
cnt++;
sum += prime[++high];
} else if (sum > N) {
sum -= prime[low++];
}
}
cout << cnt;
return 0;
}
Originally published May 18, 2021
Latest update May 18, 2021
Related posts :