Problem p02804 (python)

Fixed submission:
N, K = map(int,input().split())
A = list(map(int,input().split()))
A.sort()
MOD = 10**9+7

#階乗テーブルと逆元テーブルを作成する
fac = [0]*(N+1) # 階乗テーブル
fac[0] = fac[1] = 1
inv = [0]*(N+1) # 逆元テーブル
inv[1] = 1
facinv = [0]*(N+1) # 階乗の逆元テーブル
facinv[0] = facinv[1] = 1
for i in range(2,N+1):
    fac[i] = fac[i-1]*i%MOD
    inv[i] = MOD - inv[MOD%i] * (MOD//i) % MOD
    facinv[i] = facinv[i-1] * inv[i] % MOD

def nCr(n, r, mod):
    if n < r or n < 0 or r < 0:return 0
    #毎回MODで割ってもいい。
    else:return fac[n] * (facinv[r] * facinv[n-r] % mod) % mod
    

# 各要素が最大値、最小値として何回使われるか考える
maxsum = 0
minsum = 0
for i,a in enumerate(A):
    maxsum += nCr(i, K-1, MOD)*a
    maxsum %= MOD
    minsum += nCr(N-i-1, K-1, MOD)*a
    minsum %= MOD
ans = (maxsum-minsum)%MOD

print(ans)

Buggy submission (verdict: Runtime Error):
N, K = map(int,input().split())
A = list(map(int,input().split()))
A.sort()
MOD = 10**9+7


def comb(n, r, mod):
    if ( r<0 or r>n ):
        return 0
    r = min(r, n-r)
    return g1[n] * g2[r] * g2[n-r] % mod


n = 10**4
g1 = [1, 1] # 元テーブル
g2 = [1, 1] #逆元テーブル
inverse = [0, 1] #逆元テーブル計算用テーブル


for i in range( 2, n + 1 ):
    g1.append( ( g1[-1] * i ) % MOD )
    inverse.append( ( -inverse[MOD % i] * (MOD//i) ) % MOD )
    g2.append( (g2[-1] * inverse[-1]) % MOD )
    



maxsum = 0
minsum = 0
for i,a in enumerate(A):
    maxsum += comb(i,K-1, MOD)*a
    maxsum %= MOD
    minsum += comb(N-i-1,K-1, MOD)*a
    minsum %= MOD
ans = (maxsum-minsum)%MOD

print(ans)

Buggy submission (verdict: Runtime Error):
def cmb(n, r, mod):
    if ( r<0 or r>n ):
        return 0
    r = min(r, n-r)
    return g1[n] * g2[r] * g2[n-r] % mod

N = 10**4
g1 = [1, 1] # 元テーブル
g2 = [1, 1] #逆元テーブル
inverse = [0, 1] #逆元テーブル計算用テーブル

mod = 10**9 + 7
for i in range( 2, N + 1 ):
    g1.append( ( g1[-1] * i ) % mod )
    inverse.append( ( -inverse[mod % i] * (mod//i) ) % mod )
    g2.append( (g2[-1] * inverse[-1]) % mod )
    

N, K = map(int,input().split())
A = list(map(int,input().split()))
A.sort()
MOD = 10**9+7

maxsum = 0
minsum = 0
for i,a in enumerate(A):
    maxsum += comb(i,K-1)*a
    maxsum %= MOD
    minsum += comb(N-i-1,K-1)*a
    minsum %= MOD
ans = (maxsum-minsum)%MOD

print(ans)

Buggy submission (verdict: Runtime Error):
def cmb(n, r, mod):
    if ( r<0 or r>n ):
        return 0
    r = min(r, n-r)
    return g1[n] * g2[r] * g2[n-r] % mod

N = 10**4
g1 = [1, 1] # 元テーブル
g2 = [1, 1] #逆元テーブル
inverse = [0, 1] #逆元テーブル計算用テーブル

for i in range( 2, N + 1 ):
    g1.append( ( g1[-1] * i ) % mod )
    inverse.append( ( -inverse[mod % i] * (mod//i) ) % mod )
    g2.append( (g2[-1] * inverse[-1]) % mod )
    

N, K = map(int,input().split())
A = list(map(int,input().split()))
A.sort()
MOD = 10**9+7

maxsum = 0
minsum = 0
for i,a in enumerate(A):
    maxsum += comb(i,K-1)*a
    maxsum %= MOD
    minsum += comb(N-i-1,K-1)*a
    minsum %= MOD
ans = (maxsum-minsum)%MOD

print(ans)

Buggy submission (verdict: Runtime Error):
from scipy.special import comb

N, K = map(int,input().split())
A = list(map(int,input().split()))
A.sort()
MOD = 10**9+7

    
maxsum = 0
minsum = 0
for i,a in enumerate(A):
    maxsum += comb(i,K-1)*a
    maxsum %= MOD
    minsum += comb(N-i-1,K-1)*a
    minsum %= MOD
ans = (maxsum-minsum)%MOD

print(ans)