Buggy python submission (verdict: Time Limit Exceeded):
N, A = map(int, input().split())
X = list(map(int, input().split()))

nega = []
posi = []
zero = 0
for x in X:
    if x < A: nega.append(A-x)
    elif A < x: posi.append(x-A)
    else: zero += 1

if len(nega) <= len(posi):
    arrf = sorted(nega)[::-1]
    arrg = sorted(posi)[::-1]
else:
    arrf = sorted(posi)[::-1]
    arrg = sorted(nega)[::-1]

from collections import defaultdict
from itertools import product
ans = 0
f = defaultdict(int)
g = defaultdict(int)
fmax = 0

for vr in product(range(2), repeat=len(arrf)):
    x = 0
    for i in range(len(vr)):
        x += vr[i] * arrf[i]
    if x == 0: continue
    f[x] += 1
    fmax = max(fmax, x)

for vr in product(range(2), repeat=len(arrg)):
    x = 0
    for j in range(len(vr)):
        x += vr[j] * arrg[j]
        if fmax < x: break
    if x == 0: continue
    g[x] += 1
    ans += f[x]

ans *= 2 ** zero
ans += 2 ** zero - 1
print(ans)

Fixed submission:
def abc044_c():
    import numpy as np
    n, a = map(int, input().split())
    x = list(map(lambda x: int(x) - a, input().split()))  # 平均ターゲット値を引いておく
    x = np.array(x, dtype=np.int64)

    vrange = n * (a + np.max(x))  # 取りうる値の幅(片側), 広めにとってもかまわない
    dp = np.zeros((n+1, 2*vrange+1), dtype=np.int64)  # DPテーブル
    dp[0, vrange] = 1  # 0枚時点で何も選ばずに総和0(平均ターゲット)になる場合を初期値にセット

    for i in np.arange(n):
        # 1つ前のターンを引き継ぐ
        dp[i+1, :] += dp[i, :]
        if 0 < x[i]:
            # x[i]が正の値、1つ前のx[i]個ぶん左側をスライドして持ってくる
            dp[i+1, x[i]:] += dp[i, :-x[i]]
        elif x[i] < 0:
            # x[i]が負の値、1つ前のx[i]個ぶん右側をスライドして持ってくる
            dp[i+1, :x[i]] += dp[i, -x[i]:]
        else:
            # x[i]がゼロ
            dp[i+1, :] += dp[i, :]

    ans = dp[n, vrange] - 1  # 初期値(何も選ばない)の1通りを除く
    print(ans)

if __name__ == '__main__':
    abc044_c()

Buggy python submission (verdict: Time Limit Exceeded):
N, A = map(int, input().split())
X = list(map(int, input().split()))

nega = []
posi = []
zero = 0
for x in X:
    if x < A: nega.append(A-x)
    elif A < x: posi.append(x-A)
    else: zero += 1

if len(nega) <= len(posi):
    arrf = sorted(nega)[::-1]
    arrg = sorted(posi)[::-1]
else:
    arrf = sorted(posi)[::-1]
    arrg = sorted(nega)[::-1]

from itertools import product
ans = 0
for v in product(range(2), repeat=len(arrf)):
    f = 0
    for i in range(len(v)):
        f += v[i] * arrf[i]
    if f == 0: continue
    for w in product(range(2), repeat=len(arrg)):
        g = 0
        for j in range(len(w)):
            g += w[j] * arrg[j]
        if g == 0: continue
        #if f < g: break
        if f == g: ans += 1

ans *= 2 ** zero
ans += 2 ** zero - 1
print(ans)

Fixed submission:
def abc044_c():
    import numpy as np
    n, a = map(int, input().split())
    x = list(map(lambda x: int(x) - a, input().split()))  # 平均ターゲット値を引いておく
    x = np.array(x, dtype=np.int64)

    vrange = n * (a + np.max(x))  # 取りうる値の幅(片側), 広めにとってもかまわない
    dp = np.zeros((n+1, 2*vrange+1), dtype=np.int64)  # DPテーブル
    dp[0, vrange] = 1  # 0枚時点で何も選ばずに総和0(平均ターゲット)になる場合を初期値にセット

    for i in np.arange(n):
        # 1つ前のターンを引き継ぐ
        dp[i+1, :] += dp[i, :]
        if 0 < x[i]:
            # x[i]が正の値、1つ前のx[i]個ぶん左側をスライドして持ってくる
            dp[i+1, x[i]:] += dp[i, :-x[i]]
        elif x[i] < 0:
            # x[i]が負の値、1つ前のx[i]個ぶん右側をスライドして持ってくる
            dp[i+1, :x[i]] += dp[i, -x[i]:]
        else:
            # x[i]がゼロ
            dp[i+1, :] += dp[i, :]

    ans = dp[n, vrange] - 1  # 初期値(何も選ばない)の1通りを除く
    print(ans)

if __name__ == '__main__':
    abc044_c()

Buggy python submission (verdict: Time Limit Exceeded):
N, A = map(int, input().split())
X = list(map(int, input().split()))

nega = []
posi = []
zero = 0
for x in X:
    if x < A: nega.append(A-x)
    elif A < x: posi.append(x-A)
    else: zero += 1

if len(nega) <= len(posi):
    arrf = sorted(nega)[::-1]
    arrg = sorted(posi)[::-1]
else:
    arrf = sorted(posi)[::-1]
    arrg = sorted(nega)[::-1]

from itertools import product
ans = 0
for v in product(range(2), repeat=len(arrf)):
    f = 0
    for i in range(len(v)):
        f += v[i] * arrf[i]
    if f == 0: continue
    for w in product(range(2), repeat=len(arrg)):
        g = 0
        for j in range(len(w)):
            g += w[j] * arrg[j]
        if g == 0: continue
        #if f < g: break
        if f == g: ans += 1

ans *= 2 ** zero
ans += 2 ** zero - 1
print(ans)

Fixed submission:
def abc044_c():
    import numpy as np
    n, a = map(int, input().split())
    x = list(map(lambda x: int(x) - a, input().split()))  # 平均ターゲット値を引いておく
    x = np.array(x, dtype=np.int64)

    vrange = n * (a + np.max(x))  # 取りうる値の幅(片側), 広めにとってもかまわない
    dp = np.zeros((n+1, 2*vrange+1), dtype=np.int64)  # DPテーブル
    dp[0, vrange] = 1  # 0枚時点で何も選ばずに総和0(平均ターゲット)になる場合を初期値にセット

    for i in np.arange(n):
        # 1つ前のターンを引き継ぐ
        dp[i+1, :] += dp[i, :]
        if 0 < x[i]:
            # x[i]が正の値、1つ前のx[i]個ぶん左側をスライドして持ってくる
            dp[i+1, x[i]:] += dp[i, :-x[i]]
        elif x[i] < 0:
            # x[i]が負の値、1つ前のx[i]個ぶん右側をスライドして持ってくる
            dp[i+1, :x[i]] += dp[i, -x[i]:]
        else:
            # x[i]がゼロ
            dp[i+1, :] += dp[i, :]

    ans = dp[n, vrange] - 1  # 初期値(何も選ばない)の1通りを除く
    print(ans)

if __name__ == '__main__':
    abc044_c()