https://www.acmicpc.net/problem/1644
먼저 n이하의 소수를 구한 뒤, 그 다음 연속합을 구하는 문제이다.
메모리 조건이 빡빡할 것 같아 에라스토네세의 체를 이용하기로 했다.
또한 연속합이니 투 포인터로 구현하면 될 것 같았다.
글을 쓰다 보니 solve 함수를 왜 구현했지? 라는 생각이 든다.
while 조건문에서 바로바로 숫자를 빼줬으면 됐을텐데
만약 시간 초과가 났다면 위 방식으로 했을 것이다.
import sys
n = int(input())
if n == 1: # n은 1일땐 arsto()가 안돌아가서 공백이기에 그냥 바로 0 출력하고 종료
print(0)
sys.exit(0)
visited = [False, False] + [True] * (n - 1) # 0, 1은 False로 선언
left = right = cnt = 0
primes = []
def arsto(): # start부터 end사이의 합 구하기
for i in range(2, n + 1):
if visited[i]:
primes.append(i)
for j in range(2 * i, n + 1, i):
visited[j] = False
def solve(start, end):
temp = 0
for i in range(start, end + 1):
temp += primes[i]
return temp
arsto()
while 1:
temp = solve(left, right)
if temp < n:
right += 1
elif temp == n:
cnt += 1
right += 1
else:
left += 1
if right == len(primes) and left == len(primes) - 1:
break
print(cnt)