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))
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)) |