본문 바로가기
알고리즘 일기

1644번 : 소수의 연속합

by Beijing_KingGod 2019. 11. 30.

1. 에라토스의 체? 그걸로 일단 4000,000 까지의 소수의 집합을 구했다.

2. 2019/11/30 - [알고리즘 일기] - 2003번: 수들의 합 2 에서 사용했던 테크닉으로 값을 도출하였다.

#include<iostream>
#include<memory.h>
#include<vector>
using namespace std;

bool a[4000001];

int main() {
	memset(a, true, sizeof(a));
	int n;
	cin >> n;
	vector<int> prime;
	for (int i = 2; i < 4000001; i++) {
		if (a[i] == false) continue;
		prime.push_back(i);
		for (int j = i*2; j < 4000001; j += i) {
			a[j] = false;
		}
	}
	int R = 0;
	int L = 0;
	int ans = 0;
	int sum = prime[0];
	int p = prime.size();
	while (L <= R && R < p) {
		if (sum < n) { // 목표치보다 작음 R 증가
			R++;
			if (R >= p) break;
			sum += prime[R];
		}
		else if (sum == n) { // 같음 R 증가
			ans++;
			R++;
			if (R >= p) break;
			sum += prime[R];
		}
		else if (sum > n) { // 목표치 보다 큼 L 증가
			sum -= prime[L];
			L++;
			if (L > R&&L<p) {
				R = L;
				sum = prime[R];
			}
		}
	}
	cout << ans << '\n';
	return 0;
}

'알고리즘 일기' 카테고리의 다른 글

2143번: 두 배열의 합  (0) 2019.11.30
1208번 : 부분수열의 합2  (0) 2019.11.30
1806번 : 부분합  (0) 2019.11.30
2003번: 수들의 합 2  (0) 2019.11.30
프로그래머스 : 종이접기 DP  (0) 2019.11.30

댓글