본문 바로가기
📊알고리즘/BOJ

BOJ 1644 - 소수의 연속합

by meteorfish 2024. 4. 23.
728x90

1644번: 소수의 연속합 (acmicpc.net)

 

접근 방법

투 포인터와 소수판별 알고리즘이 혼합된 문제이다.

소수 판별을 하기 위해 에라스토테네스의 체를 이용하여 소수를 배열에 저장한다.

해당 소수 배열을 투포인트를 돌면서 각 연속적인 수들의 합이 N이 될 때, 경우의 수를 + 1한다.

 

코드

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

#define MAX 4000001
#define ll long long

bool chk[MAX+3];
vector<ll> arr;
ll n, s;

void func() {
	chk[1] = true;
	for (int i = 2; i < MAX; i++) {
		if(!chk[i])
			arr.push_back(i);
		for (int j = i + i; j < MAX; j+=i) {
			chk[j] = true;
		}
	}
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cin >> n;

	func();
	int l = 0; int r = 0;
	int tmp = 0;
	int res = 0;
	for (l = 0; l < arr.size(); l++) {
		
		while (r < arr.size() && tmp < n) {
			tmp += arr[r];
			r++;
		}

		if (tmp == n) {
			res++;
		}
		tmp -= arr[l];
	}
	cout << res;
}

 

728x90

'📊알고리즘 > BOJ' 카테고리의 다른 글

BOJ 2531 - 회전 초밥  (0) 2024.04.29
BOJ 2473 - 세 용액  (0) 2024.04.23
BOJ 1806 - 부분합  (1) 2024.04.23
BOJ 2230 - 수 고르기  (0) 2024.04.22
BOJ 2143 - 두 배열의 합  (0) 2024.04.22