def abc044_c():

    import numpy as np

    n, a = list(map(int, input().split()))

    x = list([int(x) - a for x in 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()
def abc044_c():

    ''' 過去提出を参考に '''

    _, A = list(map(int, input().split()))

    X = list([int(x) - A for x in input().split()])

    d = {0: 1}  # 負の値を取り得るため、配列でなく辞書で持つ

    for x in X:

        prev = list(d.items())  # 前のターンのぶんを保持しておく

        for val, cnt in prev:

            d[val + x] = d.get(val + x, 0) + cnt

    ans = d[0] - 1

    print(ans)



if __name__ == '__main__':

    abc044_c()
def abc044_c():
    import numpy as np

    n, a = list(map(int, input().split()))
    x = list([int(x) - a for x in 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()

def abc044_c():
    """過去提出を参考に"""
    _, A = list(map(int, input().split()))
    X = list([int(x) - A for x in input().split()])
    d = {0: 1}  # 負の値を取り得るため、配列でなく辞書で持つ
    for x in X:
        prev = list(d.items())  # 前のターンのぶんを保持しておく
        for val, cnt in prev:
            d[val + x] = d.get(val + x, 0) + cnt
    ans = d[0] - 1
    print(ans)


if __name__ == "__main__":
    abc044_c()

-    import numpy as np - -    n, a = list(map(int, input().split())) -    x = list([int(x) - a for x in 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通りを除く +    """過去提出を参考に""" +    _, A = list(map(int, input().split())) +    X = list([int(x) - A for x in input().split()]) +    d = {0: 1}  # 負の値を取り得るため、配列でなく辞書で持つ +    for x in X: +        prev = list(d.items())  # 前のターンのぶんを保持しておく +        for val, cnt in prev: +            d[val + x] = d.get(val + x, 0) + cnt +    ans = d[0] - 1