티스토리 뷰

728x90

문제 링크

www.acmicpc.net/problem/1644

 

1644번: 소수의 연속합

첫째 줄에 자연수 N이 주어진다. (1 ≤ N ≤ 4,000,000)

www.acmicpc.net

 

풀이

모든 소수는 양수이므로 투 포인터를 적용할 수 있습니다. i, j를 꿈틀꿈틀하게 움직여줍시다.

sum + primes[j]가 n 이하이면 sum에 primes[j]를 더해주고 j를 증가, n보다 크면 primes[i]를 빼고 i를 증가시켜줍니다.

 

 

정답 코드

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vi = vector<int>;
using vb = vector<bool>;

vi primes;
int n;

void init() {
    vb isPrime(4'444'444, true);
    isPrime[1] = isPrime[0] = false;
    for (ll i = 2; i < 4'444'444; i++) {
        if (isPrime[i]) {
            primes.push_back(i);
            for (ll j = i * i; j < 4'444'444; j += i) {
                isPrime[j] = false;
            }
        }
    }
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    init();
    cin >> n;
    int sum = 0;
    int ans = 0;
    for (int i = 0, j = 0; j < primes.size();) {
        if (sum + primes[j] <= n) {
            sum += primes[j++];
        } else {
            sum -= primes[i++];
        }
        if (sum == n)ans++;
    }
    cout << ans;
}
728x90

'알고리즘 > 문제 풀이' 카테고리의 다른 글

[BOJ] 백준 1799 비숍  (0) 2021.03.08
[BOJ] 백준 1647 도시 분할 계획  (0) 2021.03.08
[BOJ] 백준 1562 계단 수  (0) 2021.03.07
[BOJ] 백준 10844 쉬운 계단 수  (0) 2021.03.07
[BOJ] 백준 1516 게임 개발  (0) 2021.03.07
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함