Problem p02862 (python)

Fixed submission:
x,y = map(int,input().split())

class ModComb:
    def __init__(self, MAX, mod=10 ** 9 + 7):
        fac = [1, 1]
        finv = [1, 1]
        inv = [0, 1]
        for i in range(2, MAX):
            fac.append(fac[i - 1] * i % mod)
            inv.append(mod - inv[mod % i] * (mod // i) % mod)
            finv.append(finv[i - 1] * inv[i] % mod)
        self.fac, self.finv, self.mod = fac, finv, mod
 
    def nCk(self, n, k):
        if n < k or n < 0 or k < 0:
            return 0
        fac, finv, mod = self.fac, self.finv, self.mod
        return fac[n] * (finv[k] * finv[n - k] % mod) % mod

if (x+y)%3!=0:
    print(0)
else:
    a = (2*x - y) // 3
    b = (2*y - x) // 3

    mod = 10 ** 9 + 7
    mc = ModComb(1000000, mod=mod) 

    print(mc.nCk(a + b, a) % mod)

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

class ModComb:
    def __init__(self, MAX, mod=10 ** 9 + 7):
        fac = [1, 1]
        finv = [1, 1]
        inv = [0, 1]
        for i in range(2, MAX):
            fac.append(fac[i - 1] * i % mod)
            inv.append(mod - inv[mod % i] * (mod // i) % mod)
            finv.append(finv[i - 1] * inv[i] % mod)
        self.fac, self.finv, self.mod = fac, finv, mod
    
    def nCk(self, n, k):
        if n < k or n < 0 or k < 0:
            return 0
        fac, finv, mod = self.fac, self.finv, self.mod
        return fac[n] * (finv[k] * finv[n - k] % mod) % mod

if (X+Y)%3 != 0:
    print(O)
else:
    n = (2*X-Y)//3
    m = (2*Y-X)//3
    
    mod = 10 ** 9 + 7
    mc = ModComb(1000000, mod=mod) 

    print(mc.nCk(n+m, n) % mod)

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

class ModComb:
    def __init__(self, MAX, mod=10 ** 9 + 7):
        fac = [1, 1]
        finv = [1, 1]
        inv = [0, 1]
        for i in range(2, MAX):
            fac.append(fac[i - 1] * i % mod)
            inv.append(mod - inv[mod % i] * (mod // i) % mod)
            finv.append(finv[i - 1] * inv[i] % mod)
        self.fac, self.finv, self.mod = fac, finv, mod
    
    def nCk(self, n, k):
        if n < k or n < 0 or k < 0:
            return 0
        fac, finv, mod = self.fac, self.finv, self.mod
        return fac[n] * (finv[k] * finv[n - k] % mod) % mod
      
if (X+Y)%3 != 0:
    print(O)
else:
    n = (2*X-Y)//3
    m = (2*Y-X)//3
    
    mod = 10 ** 9 + 7
    mc = ModComb(1000000, mod=mod) 

    print(mc.nCk(n+m, n) % mod)

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

class ModComb:
    def __init__(self, MAX, mod=10 ** 9 + 7):
        fac = [1, 1]
        finv = [1, 1]
        inv = [0, 1]
        for i in range(2, MAX):
            fac.append(fac[i - 1] * i % mod)
            inv.append(mod - inv[mod % i] * (mod // i) % mod)
            finv.append(finv[i - 1] * inv[i] % mod)
        self.fac, self.finv, self.mod = fac, finv, mod
    
    def nCk(self, n, k):
        if n < k or n < 0 or k < 0:
            return 0
        fac, finv, mod = self.fac, self.finv, self.mod
        return fac[n] * (finv[k] * finv[n - k] % mod) % mod
      
if (X+Y)%3 != 0:
    print(O)
else:
    n = (-X+2*Y)//3
    m = (2*X-Y)//3
    
    mod = 10 ** 9 + 7
    mc = ModComb(1000000, mod=mod) 

    print(mc.nCk(n+m, n) % mod)

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

class ModComb:
    def __init__(self, MAX, mod=10 ** 9 + 7):
        fac = [1, 1]
        finv = [1, 1]
        inv = [0, 1]
        for i in range(2, MAX):
            fac.append(fac[i - 1] * i % mod)
            inv.append(mod - inv[mod % i] * (mod // i) % mod)
            finv.append(finv[i - 1] * inv[i] % mod)
        self.fac, self.finv, self.mod = fac, finv, mod
    
    def nCk(self, n, k):
        if n < k or n < 0 or k < 0:
            return 0
        fac, finv, mod = self.fac, self.finv, self.mod
        return fac[n] * (finv[k] * finv[n - k] % mod) % mod
      
if (X+Y)%3 != 0:
    print(O)
else:
    n = Y - (X+Y)//3
    m = X - (X+Y)//3
    
    mod = 10 ** 9 + 7
    mc = ModComb(1000000, mod=mod) 

    print(mc.nCk(n+m, n) % mod)

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

def pairs (xs):
    if 2 > len(xs):
        return []
    else:
        return [xs[0:2]] + pairs(xs[1:])

def pascal (n):
    def compute (prev):
        return [1] + [x + y for (x,y) in pairs(prev)] + [1]
    def aux (m, prev):
        if (m > n):
            return []
        else:
            return [prev] + aux(m + 1, compute(prev))
    return aux(1, [1])
  
import math
a = 10**9+7

if (X+Y) % 3 != 0:
    print(0)
else:
    if abs(X-Y) > (X+Y)/3:
        print(0)
    else:
        line = pascal(int((X+Y)/3)+1)
        bangou = int(min(X,Y) - (X+Y)/3)
        print( line[int((X+Y)/3)][bangou]%a )