1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import bisect
import sys
from functools import lru_cache

sys.setrecursionlimit(10**5)

h, w = list(map(int, sys.stdin.readline().split()))
n = int(sys.stdin.readline())
d = list(map(int, sys.stdin.readline().split()))

@lru_cache(maxsize=None)
def go(a, b):
    ab = min(a, b)
    if ab == 0:
        return 0
    if ab < d[0]:
        return -1
    ms = d[bisect.bisect(d, ab)-1]

    multia = a // ms
    multib = b // ms

    dx = a - ms*multia
    dy = b - ms*multib

    if dx <= dy:
        v3 = go(dx, dy)
    else:
        v3 = go(dy, dx)
    if v3 == -1:
        return -1

    if ms*multib <= dx:
        v1 = go(ms*multib, dx)
    else:
        v1 = go(dx, ms * multib)
    if v1 == -1:
        return -1

    v2 = go(ms*multia, dy)
    if v2 == -1:
        return -1

    return v1 + v2 + v3 + multia*multib


print(go(h, w))