부터 까지의 정수로 표시되는 개 마을이 존재한다. 마을 부터 까지 순서대로 이동하면서 단일 품목(한 종류)의 물건에 대해 거래를 하려고 한다.
각 마을에서는 "물건을 개 사기" 또는 "원하는 만큼 개 이상 물건을 팔기"를 선택할 수 있다. 물론, 시작 시에는 물건을 가지고 있지 않다.
마을 에서 한 개의 물건을 사거나 파는 가격은 동일하고 이 가격을 라고 하자. 몇 개의 마을에서는 물건의 가격이 알려져 있지만, 그 외의 마을에서는 가격이 알려져 있지 않다. 그러나, 개의 가격 은 항상 의 순열임은 알려져 있다.
가격을 나타내는 순열 을 으로 표기하자. 여기서, 이미 알려진 가격을 제외하고 (물음표)로 표시하면, 알려지지 않은 가격들에 대하여 모든 가능한 순열을 나타낼 수 있다. 예를 들어, 이미 알려진 가격 와 에 대해, 은 순열 과 을 나타낸다.
물건의 가격을 나타내는 가 포함된 순열이 주어질 때, 가능한 모든 순열 각각에 대해서, 사고 파는 거래를 통해서 얻을 수 있는 최대 이득을 구하고 그 총합을 출력하는 프로그램을 작성하시오.
예를 들어, 이 주어지면, 순열 에서는 마을 , , 에서 각각 물건을 사고 마을 에서 물건을 모두 팔아 의 이득을 얻는다. 또한 순열 에서는 마을 에서 물건을 사고 마을 에서 팔아 의 이득을 볼 수 있다. 따라서, 최대 이득의 총합은 이다.
입력 형식
첫 줄에 마을의 개수를 나타내는 정수 이 주어진다.
그다음 줄에 마을의 물건 가격의 순열을 나타내는 개 정수 이 공백으로 구분되어 차례대로 주어진다. 여기서, 이상 이하의 정수는 이미 알려진 물건 가격을 나타내고, 은 물건 가격이 알려지지 않은 임을 나타낸다. 양수인 의 값은 모두 다르다.
출력 형식
첫 줄에 모든 가능한 순열에 대한 최대 이득의 총합을 으로 나눈 나머지를 출력한다.
예제 1
입력
4 1 0 3 0
출력
9
예제 2
입력
4 1 4 3 2
출력
3
채점 방식
입력 케이스들은 다음과 같은 종류로 구별되며, 한 종류의 케이스를 다 맞혀야 그 종류에 배정된 점수를 받을 수 있다.
종류 1: 5점
종류 2: 6점
종류 3: 5점
인 의 개수가 이하이다.
종류 4: 10점
종류 5: 17점
인 의 개수가 이하이다.
종류 6: 23점
종류 7: 34점
모든 입력 케이스가 주어진다.
해설
을 포함하지 않고 모든 값이 완전히 결정된 순열 가 주어졌을 때, 최대 이득은 다음과 같이 계산할 수 있습니다:
- 각 에 대해, 원소의 값이 이상인 가장 오른쪽에 위치한 원소 를 찾은 후, 중에서 값이 이하인 원소의 개수를 구합니다. 이 개수의 총합은 최대 이득과 같습니다.
따라서, 위 과정에서 가능한 모든 상에 대해, 그러한 순열 의 개수를 세면 문제를 해결할 수 있습니다.
이는 그러한 순열의 개수를 DP로 정의하여 재귀적으로 계산할 수 있습니다. 여기서, 중에서 값이 이하인 원소의 개수는 자연스럽게 결정됨에 유의하세요.
전체 시간 복잡도는 입니다.