어흥

[백준 1644] 소수의 연속합 (C++) 본문

알고리즘/백준

[백준 1644] 소수의 연속합 (C++)

라이언납시오 2020. 5. 10. 16:34
728x90
반응형

문제 링크: https://www.acmicpc.net/problem/1644

 

1644번: 소수의 연속합

문제 하나 이상의 연속된 소수의 합으로 나타낼 수 있는 자연수들이 있다. 몇 가지 자연수의 예를 들어 보면 다음과 같다. 3 : 3 (한 가지) 41 : 2+3+5+7+11+13 = 11+13+17 = 41 (세 가지) 53 : 5+7+11+13+17 = 53 (두 가지) 하지만 연속된 소수의 합으로 나타낼 수 없는 자연수들도 있는데, 20이 그 예이다. 7+13을 계산하면 20이 되기는 하나 7과 13이 연속이 아니기에 적합한 표현이 아니다. 또한 한

www.acmicpc.net

1. 주의할 점

- 에라토스테네스의 체를 이용하여 소수들을 구한다

- N=1일때 0을 출력한다

- 투 포인터를 이용하여 해결한다

 

2. 구현

- 에라토스테네스의 체를 이용하여 구한 소수들을 벡터에 담는다

- 투포인터를 통해 구간의 합이 Num과 같은지 확인한다

- 구간의 합(Sum)이 Num보다 작을 때, 같을 때, 클 때 모두 조건을 통해 해결한다

 

#include <iostream>
#include <algorithm>
#include <math.h>
#include <vector>
using namespace std;
int primary[4000001], num;

void cal() {
	for (int i = 2; i <= num; i++)
		primary[i] = i;
	for (int i = 2; i <= sqrt(num); i++) {
		if (primary[i] == 0) continue;
		for (int j = i + i; j <= num; j += i)
			primary[j] = 0;
	}
}

int main() {
	cin >> num;
	if (num < 2)
		cout << 0 << '\n';
	else {
		cal();
		vector<int> v;
		for (int i = 2; i <= num; i++)
			if (primary[i])
				v.push_back(i);
		int r = 0, l = 0, cnt = 0;

		int sum = v[0];
		while (l <= r && r != v.size()) {
			if (sum == num) {
				cnt++;
				if (l == r) {
					r++;
					if (r == v.size()) break;
					sum += v[r];
				}
				else {
					sum -= v[l];
					l++;
				}
			}
			else if (sum > num) {
				if (l == r) break;
				else {
					sum -= v[l];
					l++;
				}
			}
			else if (sum < num) {
				r++;
				if (r == v.size()) break;
				sum += v[r];
			}
		}
		cout << cnt;
	}
	system("pause");
	return 0;
}

 

728x90
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준 10282] 해킹 (C++)  (0) 2020.05.10
[백준 2230] 수 고르기 (C++)  (0) 2020.05.10
[백준 16724] 피리 부는 사나이 (C++)  (0) 2020.05.10
[백준 11400] 단절선 (C++)  (0) 2020.05.08
[백준 11266] 단절점 (C++)  (0) 2020.05.08
Comments