๐Ÿšง This website is under construction. ๐Ÿšง
AtCoder
ABC
231
E

DP
ABC
E

ABC231 E - Minimal payments

https://atcoder.jp/contests/abc231/tasks/abc231_e (opens in a new tab)
้’่‰ฒไธ‹ไฝใ€‚DPใ€‚

ๅ„็กฌ่ฒจ AiA_i ใซใคใ„ใฆใ€ๆ”ฏๆ‰•ใ†้‡‘้กใ‚’่ถ…ใˆใชใ„ใ‚ˆใ†ใซ X/AiX/A_i ๆžšๆ‰•ใ†ใ‹ใ€ใŠ้‡ฃใ‚Šใ‚’ใ‚‚ใ‚‰ใฃใฆ X/Ai+1X/A_i+1 ๆžšๆ‰•ใ†ใ‹ใฎ 2 ้€šใ‚Šๅญ˜ๅœจใ™ใ‚‹ใ€‚ ใ“ใ‚Œใ‚‰ใฎๆ”ฏๆ‰•ใ„ใซใŠใ„ใฆใ€ Aiโˆ’1A_{i-1} ไปฅไธ‹ใฎ็กฌ่ฒจใ‚’ไฝฟใฃใฆๆ”ฏๆ‰•ใ†ในใ้‡‘้กใฏใใ‚Œใžใ‚Œ X%AiX\%A_i ๅ††ใ€ Aiโˆ’X%AiA_i-X\%A_i ๅ††ใจใชใ‚‹ใ€‚

Aiโˆ’1A_{i-1} ๅ††ใงใ‚‚ไธŠใจๅŒๆง˜ใซ่ถ…ใˆใ‚‹๏ผ่ถ…ใˆใชใ„ใ‚ˆใ†ใซๆ”ฏๆ‰•ใ†ใจใ€ Aiโˆ’2A_{i-2} ไปฅไธ‹ใฎ็กฌ่ฒจใ‚’ไฝฟใฃใฆๆ”ฏๆ‰•ใ†ในใ้‡‘้กใฏใ€ X%Ai%Aiโˆ’1X\%A_i\%A_{i-1} ๅ††ใ€ Aiโˆ’1โˆ’X%Ai%Aiโˆ’1A_{i-1}-X\%A_i\%A_{i-1} ๅ††ใ€ (Aiโˆ’X%Ai)%Aiโˆ’1(A_i-X\%A_i)\%A_{i-1} ๅ††ใ€ Aiโˆ’1โˆ’(Aiโˆ’X%Ai)%Aiโˆ’1A_{i-1}-(A_i-X\%A_i)\%A_{i-1} ๅ††ใจใชใ‚‹ใ€‚

ใ“ใ“ใงใ€ Aiโˆ’1ร—k=AiA_{i-1}\times k=A_i ใงใ‚ใ‚‹ใ“ใจใ‚’่ธใพใˆใ‚‹ใจใ€ไธŠใฎๅ„้‡‘้กใฏ็ตๅฑ€ X%Aiโˆ’1X\%A_{i-1} ๅ††ใ€ Aiโˆ’1โˆ’X%Aiโˆ’1A_{i-1}-X\%A_{i-1} ใฎ 2 ็จฎ้กžใงใ‚ใ‚‹ใ€‚

ใ‚ˆใฃใฆใ€ๅ„็กฌ่ฒจใงๆ”ฏๆ‰•ใ†้š›ใซใใฎ้‡‘้กไปฅไธ‹ใฎ็กฌ่ฒจใงๆ”ฏๆ‰•ใ†ในใใ‚ˆใ†ใช้‡‘้กใจใ„ใ†ใฎใฏใ€้ซ˜ใ€… 2 ็จฎ้กžใซ่ฝใก็€ใใฎใงใ€้‡‘้กใฎๅคงใใ„ใ‚ณใ‚คใƒณใ‹ใ‚‰้ †็•ชใซใ€่ถ…ใˆใชใ„ใ‚ˆใ†ใซๆ”ฏๆ‰•ใ†ใ‹ใ€ใŠ้‡ฃใ‚Šใ‚’ใ‚‚ใ‚‰ใ†ใ‚ˆใ†ใซๆ”ฏๆ‰•ใ†ใ‹ใฎ 2 ้€šใ‚Šใ‚’่€ƒใˆใฆใ„ใ‘ใฐ่‰ฏใ„ใ€‚

def memorize(f):
    memo = {}
 
    def inner(*args):
        if args not in memo:
            memo[args] = f(*args)
        return memo[args]
 
    return inner
 
 
@memorize
def rec(i, x):
    if i == 0:
        return x
    return min(x // a[i] + rec(i - 1, x % a[i]),
               x // a[i] + 1 + rec(i - 1, -x % a[i]))
 
 
n, x = map(int, input().split())
a = list(map(int, input().split()))
 
print(rec(n - 1, x))