λ°±μ€ 1644. μμμ μ°μν©(ν¬ ν¬μΈν°, μμ ꡬνκΈ°)
λ¬Έμ π΅π«
νλ μ΄μμ μ°μλ μμμ ν©μΌλ‘ λνλΌ μ μλ μμ°μλ€μ΄ μλ€. λͺκ°μ§ μμ°μμ μλ₯Ό λ€μ΄ 보면 λ€μκ³Ό κ°λ€.
- 3: 3(ν κ°μ§)
- 41 : 2+3+4+7+11+13 = 11+13+17 = 41(μΈ κ°μ§)
- 53 : 5+7+11+13+17 = 53(λ κ°μ§)
νμ§λ§ μ°μλ μμμ ν©μΌλ‘ λνλΌ μ μλ μμ°μλ€λ μλλ°, 20μ΄ κ·Έ μμ΄λ€. 7+13μ κ³μ°νλ©΄ 20μ΄ λκΈ°λ νλ 7κ³Ό 13μ΄ μ°μμ΄ μλκΈ°μ μ ν©ν ννμ΄ μλλ€. λν ν μμλ λ°λμ ν λ²λ§ λ§μ μ μ¬μ©λ μ μκΈ° λλ¬Έμ, 3+5+5+7κ³Ό κ°μ ννλ μ ν©νμ§ μλ€.
μμ°μκ° μ£Όμ΄μ‘μ λ, μ΄ μμ°μλ₯Ό μ°μλ μμμ ν©μΌλ‘ λνλΌ μ μλ κ²½μ°μ μλ₯Ό ꡬνλ νλ‘κ·Έλ¨μ μμ±νμμ€.
λ΄ νπ¦·
# 1644. μμμ μ°μν©
import sys
input = sys.stdin.readline
N = int(input())
prime = []
arr = [True for _ in range(N+1)]
arr[0] = arr[1] = False
for i in range(2, N+1):
if arr[i]:
prime.append(i)
# iμ 2λ°° μ΄μ λΆν°λ λ€ false...
for j in range(2*i, N+1, i):
arr[j] = False
result = start = end = 0
while end <= len(prime):
each = sum(prime[start:end])
if each == N:
result += 1
end += 1
elif each < N:
end += 1
else:
start += 1
print(result)
골λ 3 μλνκ³ λ μμ² μ΄λ €μ΄ λ¬Έμ λ μλμ§λ§ λΉκ΅μ λΉ λ₯Έ μκ°μ μμλ₯Ό ꡬνκ³ λ ν¬ν¬μΈν°λ₯Ό μ¨μΌ νκΈ° λ¨λ¬Έμ λκ°μ§ μκ³ λ¦¬μ¦ κ°λ μ μκ³ μμ΄μΌ νλ€... κ·Έλμ μ΄κ±°μ μ ν λ¬Έμ λ‘ μμ ꡬνλ λ¬Έμ μΆμ²νλ€!!!!
μ°Έκ³ νλ©΄ μ’μ κ°λ λ€ βοΈ
- μλΌν μ€ ν λ€μ€μ 체(μμ νλ³ μκ³ λ¦¬μ¦ : μμλ€μ λλμΌλ‘ λΉ λ₯΄κ³ μ ννκ² κ΅¬νν μ μλ€)
// μλΌν μ€ν
λ€μ€μ 체λ₯Ό μ¬μ©νμ¬ μμ ꡬνκΈ°
// μ£Όμ΄μ§ λ²μ λ΄μ μλ κ° μ«μμ λν΄ μ΄κΈ°μλ λͺ¨λ TrueμΈ λ¦¬μ€νΈλ₯Ό μμ±νλ€
arr = [True for _ in range(N+1)]
// 0κ³Ό 1μ μμκ° μλλ―λ‘ Falseλ‘ κ°μ μ€μ νλ€
arr[0] = arr[1] = False
// 2λΆν° NκΉμ§μ κ° μ«μμ λν΄ μμμΈμ§ νλ³νλ€
for i in range(2, N+1):
// νμ¬ μ«μκ° μμμΈ κ²½μ°, ν΄λΉ μ«μλ₯Ό μμ λͺ©λ‘μ μΆκ°νκ³ ,,,
// νμ¬ μ«μμ λ°°μλ€μ λͺ¨λ Falseλ‘ μ€μ νλ€... (μ μ΄λ iλ₯Ό ν¬ν¨νλκΉ μμκ° μλλ€)
if arr[i]:
prime.append(i)
# iμ 2λ°° μ΄μ λΆν°λ λ€ false...
for j in range(2*i, N+1, i):
arr[j] = False
- ν¬ ν¬μΈν° (리μ€νΈμ μμ°¨μ μΌλ‘ μ κ·Όν΄μΌ ν λ λ κ°μ μ μ μμΉλ₯Ό κΈ°λ‘νλ©΄μ μ²λ¦¬νλ μκ³ λ¦¬μ¦ ex) νΉμ ν ν©μ κ°μ§λ λΆλΆ μ°μ μμ΄ μ°ΎκΈ° )
// ν¬ ν¬μΈν° ꡬννκΈ°
// λ€ λνμ κ²½μ° Nμ΄ λλ κ²°κ³Όμ μμ, λ μ μ 0μΌλ‘ μ΄κΈ°ν
result = start = end = 0
// λ ν¬μΈν°κ° μμμ κΈΈμ΄λ³΄λ€ μμλ κ°μ λμ μν
while end <= len(prime):
// νμ¬ μμλΆν° κΈκ°μ§μ μμ ν©μ κ³μ°
each = sum(prime[start:end])
// ν©μ΄ Nκ³Ό κ°λ€λ©΄ κ²°κ³Όλ₯Ό 1 μ¦κ°, λ ν¬μΈν° λν 1 μ¦κ°
if each == N:
result += 1
end += 1
// ν©μ΄ Nλ³΄λ€ μλ€λ©΄ λ ν¬μΈν° 1 μ¦κ°
elif each < N:
end += 1
// ν©μ΄ Nλ³΄λ€ ν¬λ€λ©΄ μμ ν¬μΈν° 1 μ¦κ°
else:
start += 1