Problem p02985 (python)

Fixed submission:
from collections import deque
import sys

#modの掛け算

def modmal(a,b,mod): #a*bをmodを法にして求める

    return a * b % mod


#modの割り算

def moddiv(a,b,mod): #a/bをmodを法にして求める

    return (a * pow(b,mod-2,mod)) % mod


#逆元

def inverse(a,mod): #aのmodを法にした逆元を返す
    return pow(a,mod-2,mod)



#modのn!と、n!の逆元を格納したリストを返す(拾いもの)
#factorialsには[1, 1!%mod , 2!%mod , 6!%mod… , n!%mod] が入っている
#invsには↑の逆元が入っている

def modfac(n, MOD):
 
    f = 1
    factorials = [1]
    for m in range(1, n + 1):
        f *= m
        f %= MOD
        factorials.append(f)
    inv = pow(f, MOD - 2, MOD)
    invs = [1] * (n + 1)
    invs[n] = inv
    for m in range(n, 1, -1):
        inv *= m
        inv %= MOD
        invs[m - 1] = inv
    return factorials, invs


def modnCr(n,r,mod,fac,inv): #上で求めたfacとinvsを引数に入れるべし(上の関数で与えたnが計算できる最大のnになる)

    return fac[n] * inv[n-r] * inv[r] % mod



N,K = map(int,input().split())

mod = 10**9+7
fac,inv = modfac(max(N,K)+100 , mod)

dic = {}

for i in range(N-1):

    a,b = map(int,input().split())
    a -= 1
    b -= 1

    if a not in dic:
        dic[a] = []
    if b not in dic:
        dic[b] = []

    dic[a].append(b)
    dic[b].append(a)

ans = K

for i in dic:

    if i == 0:

        ans *= fac[K-1] * inv[K-len(dic[i])-1]
        ans %= mod

        if len(dic[i]) >= K:
            print (0)
            sys.exit()

    else:

        ans *= fac[K-2] * inv[K-len(dic[i])-1]
        ans %= mod

        if len(dic[i]) >= K:
            print (0)
            sys.exit()

print (ans)

Buggy submission (verdict: Runtime Error):
import math

def nPr(n, r):
    return math.factorial(n) // math.factorial(n - r)



N,K = map(int,input().split())

ab = []
dic = {}
ans = 1

for i in range(N-1):

    a,b = map(int,input().split())
    ab.append([a,b])


while True:

    #print (ab)

    dic = {}

    if len(ab) == 0:
        ans *= K
        break
    elif len(ab) == 1:
        ans *= K * (K-1)
        break

    for i in ab:
        
        if i[0] in dic:
            dic[i[0]].append(i[1])
        
        else:
            dic[i[0]] = [i[1]]

        if i[1] in dic:
            dic[i[1]].append(i[0])
        
        else:
            dic[i[1]] = [i[0]]

    
    miki = []
    lma = 0
    for i in dic:

        lma = max(len(dic[i]),lma)
        if len(dic[i])>=2:
            miki.append(i)

    if lma >= K:
        ans = 0
        break

    for i in miki:

        lin_mik = 0
        for j in dic[i]:

            if j in miki:
                lin_mik += 1

        ans *= nPr( K - (1 + lin_mik) , len(dic[i])-lin_mik )
        #print (i,"のまわりは",nPr( K - (1 + lin_mik) , len(dic[i])-lin_mik ),"とおり")

    nab = []
    for i in ab:

        if (i[0] in miki) and (i[1] in miki):

            nab.append(i)

    ab = nab.copy()
    #print (miki,"みき",ans)

print (ans % (1000000007))

Buggy submission (verdict: Runtime Error):
import math

def nPr(n, r):
    return math.factorial(n) // math.factorial(n - r)



N,K = map(int,input().split())

ab = []
dic = {}
ans = 1

for i in range(N-1):

    a,b = map(int,input().split())
    ab.append([a,b])


while True:

    #print (ab)

    dic = {}

    if len(ab) == 0:
        ans *= K
        break
    elif len(ab) == 1:
        ans *= K * (K-1)
        break

    for i in ab:
        
        if i[0] in dic:
            dic[i[0]].append(i[1])
        
        else:
            dic[i[0]] = [i[1]]

        if i[1] in dic:
            dic[i[1]].append(i[0])
        
        else:
            dic[i[1]] = [i[0]]

    
    miki = []
    for i in dic:

        if len(dic[i])>=2:
            miki.append(i)

    for i in miki:

        lin_mik = 0
        for j in dic[i]:

            if j in miki:
                lin_mik += 1

        ans *= nPr( K - (1 + lin_mik) , len(dic[i])-lin_mik )
        #print (i,"のまわりは",nPr( K - (1 + lin_mik) , len(dic[i])-lin_mik ),"とおり")

    nab = []
    for i in ab:

        if (i[0] in miki) and (i[1] in miki):

            nab.append(i)

    ab = nab.copy()
    #print (miki,"みき",ans)

print (ans % (1000000007))