Problem p02862 (python)

Fixed submission:
def cmb(n, k, mod, fac, ifac):
    """
    nCkを計算する
    """
    k = min(k, n-k)
    return fac[n] * ifac[k] * ifac[n-k] % mod


def make_tables(mod, n):
    """
    階乗テーブル、逆元の階乗テーブルを作成する
    """
    fac = [1, 1] # 階乗テーブル・・・(1)
    ifac = [1, 1] #逆元の階乗テーブル・・・(2)
    inverse = [0, 1] #逆元テーブル・・・(3)
    
    for i in range(2, n+1):
        fac.append((fac[-1] * i) % mod)
        inverse.append((-inverse[mod % i] * (mod//i)) % mod)
        ifac.append((ifac[-1] * inverse[-1]) % mod)
    return fac, ifac


X, Y = map(int, input().split())
# 後の、n, mの大小を一定にするため
if X > Y:
    X, Y = Y, X
dist = X + Y
   
if dist % 3 != 0:
    print(0)
else:
    # (+1,+2) の移動の回数を n、(+2,+1) の移動の回数を m とする)
    # total = n + m
    # 以下の式は、2n + m = X, n + 2m = Y の連立方程式を解いた結果
    total = int((X+Y) / 3)
    n = X - total
    
    # n < 0 もしくは m < 0 の場合、たどり着けない
    # Y > X なので、m > n
    # n < 0 → 2X - Y < 0
    if Y > 2*X:
        print(0)
    else:
        MOD = 10**9 + 7

        fac, ifac = make_tables(MOD, total)
        ans = cmb(total, n, MOD, fac, ifac)
        print(ans)

Buggy submission (verdict: Runtime Error):
def cmb(n, k, mod, fac, ifac):
    """
    nCkを計算する
    """
    k = min(k, n-k)
    return fac[n] * ifac[k] * ifac[n-k] % mod


def make_tables(mod, n):
    """
    階乗テーブル、逆元の階乗テーブルを作成する
    """
    fac = [1, 1] # 階乗テーブル・・・(1)
    ifac = [1, 1] #逆元の階乗テーブル・・・(2)
    inverse = [0, 1] #逆元テーブル・・・(3)
    
    for i in range(2, n+1):
        fac.append((fac[-1] * i) % mod)
        inverse.append((-inverse[mod % i] * (mod//i)) % mod)
        ifac.append((ifac[-1] * inverse[-1]) % mod)
    return fac, ifac


X, Y = map(int, input().split())
# 後の、n, mの大小を一定にするため
if X > Y:
    X, Y = Y, X
dist = X + Y
   
if dist % 3 != 0:
    print(0)
else:
    # (+1,+2) の移動の回数を n、(+2,+1) の移動の回数を m とする)
    # total = n + m
    # 以下の式は、2n + m = X, n + 2m = Y の連立方程式を解いた結果
    total = int((X+Y) / 3)
    n = X - total
    
    # n < 0 もしくは m < 0 の場合、たどり着けない
    # Y > X なので、m > n
    # n < 0 → 2X - Y < 0
    if Y > 2*X:
        print(0)
    else:
        MOD = 10**9 + 7

        fac, ifac = make_tables(MOD, total)
        ans = cmb(total, n, mod, fac, ifac)
        print(ans)

Buggy submission (verdict: Runtime Error):
X, Y = map(int, input().split())

dist = X + Y

def cmb(n, k, mod, fac, ifac):
    """
    nCkを計算する
    """
    k = min(k, n-k)
    return fac[n] * ifac[k] * ifac[n-k] % mod

if dist % 3 != 0:
    print(0)
else:
    # (+1,+2) の移動の回数を n、(+2,+1) の移動の回数を m とする)
    # total = n + m
    total = int((X+Y) / 3)
    n = total - Y 
    
    mod = 10**9+7 
    fac = [1, 1] # 階乗テーブル・・・(1)
    ifac = [1, 1] #逆元の階乗テーブル・・・(2)
    inverse = [0, 1] #逆元テーブル・・・(3)
    
    for i in range( 2, total + 1 ):
        fac.append( ( fac[-1] * i ) % mod )
        inverse.append( ( -inverse[mod % i] * (mod//i) ) % mod )
        ifac.append( (ifac[-1] * inverse[-1]) % mod )
    
    ans = cmb(total, n, mod, fac, ifac)
    print(ans)

Buggy submission (verdict: Runtime Error):
X, Y = map(int, input().split())

mod = 10**9 + 7

# ある座標に来るパターンの数を記録するDPテーブル
dp = [[0 for _ in range(X+1)] for _ in range(Y+1)]

# 初期位置を設定
dp[0][0] = 1

for y in range(Y+1):
    for x in range(X+1):
        if (x-2) >= 0 and (y-1) >= 0:
            dp[x][y] += int(dp[x-2][y-1] % mod)
        if (x-1) >= 0 and (y-2) >= 0:
            dp[x][y] += int(dp[x-1][y-2] % mod)
        dp[x][y] %= mod

print(dp[X][Y])

Buggy submission (verdict: Runtime Error):
X, Y = map(int, input().split())

mod = 10**9 + 7

# ある座標に来るパターンの数を記録するDPテーブル
dp = [[0 for _ in range(X+1)] for _ in range(Y+1)]

# 初期位置を設定
dp[0][0] = 1

for y in range(Y+1):
    for x in range(X+1):
        if (x-2) >= 0 and (y-1) >= 0:
            dp[x][y] += int(dp[x-2][y-1] % mod)
        if (x-1) >= 0 and (y-2) >= 0:
            dp[x][y] += int(dp[x-1][y-2] % mod)
        # dp[x][y] /= mod

print(dp[X][Y])