아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

아름다운 강산

시간 제한20초메모리 제한128 MB

요약
이웃한 더미 사이로 블록을 하나씩 옮겨 블록이 남은 위치 사이 거리가 모두 소수가 되게 하는 최소 이동 횟수를 구합니다.
난이도

어려움10점 중 8점

유형
동적 계획법, 누적 합, 정수론
정답자
아직 제출이 없습니다

문제

도영이는 블록을 쌓아 만든 스택을 가지고 노는 것을 좋아한다. 스택 하나하나를 산으로 여기고 자기만의 지형을 만든다.

스택은 모두 일렬로 놓여 있고, 도영이는 한 번에 블록 하나만 옮긴다. 한 번의 움직임은 이웃한 두 스택 중 한쪽의 맨 위 블록을 다른 쪽 스택 위로 옮기는 것이다. 도영이는 언제나 이 방법으로만 블록을 재배열한다.

블록이 하나 이상 쌓인 스택을 산이라고 한다. 두 산 사이의 거리는 두 스택의 위치 번호 차이다. 어떤 두 산을 골라도 그 거리가 소수이면 그 지형이 바로 아름다운 강산이다. 서로 이웃하지 않은 두 산도 모두 따져야 한다. 산이 하나뿐인 지형도 아름다운 강산이다.

예를 들어 왼쪽부터 블록이 1, 2, 1, 3, 2, 1, 2, 1개씩 쌓여 있다고 하자. 산을 두 개만 남기려면 아무리 잘 옮겨도 12번을 움직여야 한다. 하지만 2번, 4번, 7번 스택을 산으로 정하면 6번 만에 아름다운 강산이 된다. 세 산 사이의 거리가 각각 2, 3, 5로 모두 소수이기 때문이다.

블록의 현재 상태가 주어지면, 도영이가 아름다운 강산을 만드는 데 필요한 최소 움직임 횟수를 구하시오.

입력

입력은 여러 개의 테스트 케이스로 이루어진다.

각 테스트 케이스의 첫 줄에는 스택의 개수 nn (1≤n≤300001 \le n \le 30000)이 주어진다. 다음 줄에는 정수 bb (0≤b≤10000 \le b \le 1000)가 nn개 주어지며, 왼쪽 스택부터 차례대로 그 스택에 쌓인 블록의 개수를 나타낸다. 두 정수는 공백 하나로 구분하고, 줄의 처음과 끝에는 공백이 없다. 블록이 하나도 없는 스택도 0으로 적는다.

입력의 마지막 줄에는 0 하나만 주어진다. 이 줄은 테스트 케이스가 아니라 입력이 끝났다는 표시다.

출력

각 테스트 케이스마다 아름다운 강산을 만드는 데 필요한 최소 움직임 횟수를 한 줄에 하나씩 출력한다. 다른 공백이나 빈 줄은 출력하지 않는다.

예제1

  1. 예제 1

    입력
    5
    1 2 1 2 1
    8
    1 2 1 3 2 1 2 1
    0
    
    예상 출력
    3
    6