```go
package main
import (
"fmt"
"io"
"os"
)
func main() {
buf, _ := io.ReadAll(os.Stdin)
var pos int
readInt := func() int64 {
for pos < len(buf) && buf[pos] <= ' ' {
pos++
}
if pos >= len(buf) {
return 0
}
var res int64
for pos < len(buf) && buf[pos] > ' ' {
res = res*10 + int64(buf[pos]-'0')
pos++
}
return res
}
n := int(readInt())
if n == 0 {
return
}
a := make([]int64, n)
for i := 0; i < n; i++ {
a[i] = readInt()
}
var b []int64
var c []int64
minA := int64(2e18)
lastIdx := -1
for i := 0; i < n; i++ {
if a[i] < minA {
if lastIdx != -1 {
c = append(c, int64(i-lastIdx))
}
b = append(b, a[i])
minA = a[i]
lastIdx = i
}
}
c = append(c, int64(n-lastIdx))
m := len(b)
S := make([]int64, m)
S[0] = c[0]
for i := 1; i < m; i++ {
S[i] = S[i-1] + c[i]
}
memo := make(map[int64]int64)
var solve func(v int64) int64
solve = func(v int64) int64 {
if val, ok := memo[v]; ok {
return val
}
left, right := 0, m
for left < right {
mid := int(uint(left+right) >> 1)
if b[mid] <= v {
right = mid
} else {
left = mid + 1
}
}
j := left
if j == m {
res := S[m-1] * v
memo[v] = res
return res
}
q1 := v / b[j]
r1 := v % b[j]
res1 := S[j-1]*q1*b[j] + solve(r1)
q2 := q1 - 1
r2 := b[j] - 1
res2 := S[j-1]*q2*b[j] + solve(r2)
if res2 > res1 {
res1 = res2
}
memo[v] = res1
return res1
}
ans := solve(b[0] - 1)
fmt.Println(ans)
}
```