λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸƒ algorithm/boj

BOJ 1644 - μ†Œμˆ˜μ˜ 연속합

by HandHand 2021. 3. 8.

문제

λ°±μ€€ 온라인 저지 - 1644번

풀이 κ³Όμ •

N 이 μ£Όμ–΄μ§ˆ λ•Œ μ—°μ†λœ μ†Œμˆ˜μ˜ ν•©μœΌλ‘œ N 을 λ§Œμ‘±μ‹œν‚¬ 수 μžˆλŠ” 경우의 수λ₯Ό μ°ΎλŠ” λ¬Έμ œμž…λ‹ˆλ‹€.

νŠΉμ • μˆ˜λ“€μ˜ 합이 N 이 되기 μœ„ν•΄μ„œλŠ” ν•΄λ‹Ή μˆ˜λ“€μ΄ N 보닀 μž‘μ•„μ•Ό 함은 자λͺ…ν•©λ‹ˆλ‹€.
λ”°λΌμ„œ N 보닀 μž‘κ±°λ‚˜ 같은 μˆ˜λ“€ 쀑 λͺ¨λ“  μ†Œμˆ˜λ₯Ό μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체 λ₯Ό μ΄μš©ν•΄ λ¨Όμ € ꡬ해놓은 λ‹€μŒ μ—°μ†λœ ꡬ간을 찾으면 λ©λ‹ˆλ‹€.
N 의 μ΅œλŒ€ 값이 크기 λ•Œλ¬Έμ— O(N^2) 으둜 λͺ¨λ“  ν•©μ˜ 경우의 수λ₯Ό 따지면 μ‹œκ°„ μ΄ˆκ³Όκ°€ λ°œμƒν•©λ‹ˆλ‹€.

μ½”λ“œ



N = int(input())


def eratos(n):
    sieve = [1] * (n + 1)

    for i in range(2, int(n ** 0.5) + 1):
        if sieve[i]:
            for j in range(i * 2, n + 1, i):
                sieve[j] = 0

    return [i for i in range(2, n + 1) if sieve[i]]


def solution():
    primes = eratos(N)

    if not primes:
        return 0

    answer = 0
    head, tail = 0, 0
    acc = primes[0]

    while head <= tail:
        if acc < N:
            tail += 1
            if tail < len(primes):
                acc += primes[tail]
            else:
                break
        else:
            if acc == N:
                answer += 1
            acc -= primes[head]
            head += 1

    return answer


print(solution())
λ°˜μ‘ν˜•

πŸ’¬ λŒ“κΈ€