# -*- coding: utf-8 -*-



""" 3次元DP """



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

xN = list(map(int, input().split()))

X = max(max(xN), A)



# i(=xNリストからどこまでを選べる範囲とするか)からj(=0～N)枚選んで、選んだ値の合計をkにするような選び方の総数

dp = [[[0] * (N*X+1) for j in range(N+1)] for i in range(N+1)]

dp[0][0][0] = 1



ans = 0

for i in range(1,N+1):

    for j in range(N+1):

        for k in range(N*X+1):

            # 求めたい合計(k)が、この周回で増えた選択肢(xN[i-1])より小さい場合、

            # 選び方の総数は増える見込みがないので前回の値をそのまま使用

            if k < xN[i-1]:

                dp[i][j][k] = dp[i-1][j][k]

            # 合計kが大きければ、増やせるかもしれないので、選んだ数と合計を減らしたところを見に行く

            # 選べる数j=0は論外だし、添え字[j-1]に良くないので条件で除外する

            elif k >= xN[i-1] and j > 0:

                dp[i][j][k] = dp[i-1][j][k] + dp[i-1][j-1][k-xN[i-1]]

            # 選んだ数と合計から判断して、平均が条件に合うものなら答えに足す

            if i == N and j > 0 and k == j*A:

                ans += dp[i][j][k]



# ans = 0

# for k in range(1,N+1):

#     ans += dp[N][k][k*A]

        

print(ans)
# -*- coding: utf-8 -*-



""" 2次元DP """



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

xN = list(map(int, input().split()))

X = max(max(xN), A)

# 全てのxから-Aすることで、合計=0,平均=0を求める形にする

yN = [int(i)-A for i in xN]



# 二つ目の添え字はマイナスを取りうるので工夫する

dp = [[0] * (2*N*X+1) for j in range(N+1)]

# 基準点を0じゃなくて真ん中(N*X)にする

dp[0][N*X] = 1



ans = 0

for i in range(1,N+1):

    for t in range(2*N*X+1):

        # 範囲外ならそのまま

        if t - yN[i-1] < 0 or t - yN[i-1] > 2*N*X:

            dp[i][t] = dp[i-1][t]

        # 範囲内なら前の値を足す

        elif 0 <= t - yN[i-1] <= 2*N*X:

            dp[i][t] = dp[i-1][t] + dp[i-1][t - yN[i-1]]

# 1枚も選ばないパターンを引く

print((dp[N][N*X]-1))
# -*- coding: utf-8 -*-
""" 3次元DP """
N, A = list(map(int, input().split()))
xN = list(map(int, input().split()))
X = max(max(xN), A)
# i(=xNリストからどこまでを選べる範囲とするか)からj(=0～N)枚選んで、選んだ値の合計をkにするような選び方の総数
dp = [[[0] * (N * X + 1) for j in range(N + 1)] for i in range(N + 1)]
dp[0][0][0] = 1
ans = 0
for i in range(1, N + 1):
    for j in range(N + 1):
        for k in range(N * X + 1):
            # 求めたい合計(k)が、この周回で増えた選択肢(xN[i-1])より小さい場合、
            # 選び方の総数は増える見込みがないので前回の値をそのまま使用
            if k < xN[i - 1]:
                dp[i][j][k] = dp[i - 1][j][k]
            # 合計kが大きければ、増やせるかもしれないので、選んだ数と合計を減らしたところを見に行く
            # 選べる数j=0は論外だし、添え字[j-1]に良くないので条件で除外する
            elif k >= xN[i - 1] and j > 0:
                dp[i][j][k] = dp[i - 1][j][k] + dp[i - 1][j - 1][k - xN[i - 1]]
            # 選んだ数と合計から判断して、平均が条件に合うものなら答えに足す
            if i == N and j > 0 and k == j * A:
                ans += dp[i][j][k]
# ans = 0
# for k in range(1,N+1):
#     ans += dp[N][k][k*A]
print(ans)

# -*- coding: utf-8 -*-
""" 2次元DP """
N, A = list(map(int, input().split()))
xN = list(map(int, input().split()))
X = max(max(xN), A)
# 全てのxから-Aすることで、合計=0,平均=0を求める形にする
yN = [int(i) - A for i in xN]
# 二つ目の添え字はマイナスを取りうるので工夫する
dp = [[0] * (2 * N * X + 1) for j in range(N + 1)]
# 基準点を0じゃなくて真ん中(N*X)にする
dp[0][N * X] = 1
ans = 0
for i in range(1, N + 1):
    for t in range(2 * N * X + 1):
        # 範囲外ならそのまま
        if t - yN[i - 1] < 0 or t - yN[i - 1] > 2 * N * X:
            dp[i][t] = dp[i - 1][t]
        # 範囲内なら前の値を足す
        elif 0 <= t - yN[i - 1] <= 2 * N * X:
            dp[i][t] = dp[i - 1][t] + dp[i - 1][t - yN[i - 1]]
# 1枚も選ばないパターンを引く
print((dp[N][N * X] - 1))

-""" 3次元DP """ +""" 2次元DP """ -# i(=xNリストからどこまでを選べる範囲とするか)からj(=0～N)枚選んで、選んだ値の合計をkにするような選び方の総数 -dp = [[[0] * (N * X + 1) for j in range(N + 1)] for i in range(N + 1)] -dp[0][0][0] = 1 +# 全てのxから-Aすることで、合計=0,平均=0を求める形にする +yN = [int(i) - A for i in xN] +# 二つ目の添え字はマイナスを取りうるので工夫する +dp = [[0] * (2 * N * X + 1) for j in range(N + 1)] +# 基準点を0じゃなくて真ん中(N*X)にする +dp[0][N * X] = 1 -    for j in range(N + 1): -        for k in range(N * X + 1): -            # 求めたい合計(k)が、この周回で増えた選択肢(xN[i-1])より小さい場合、 -            # 選び方の総数は増える見込みがないので前回の値をそのまま使用 -            if k < xN[i - 1]: -                dp[i][j][k] = dp[i - 1][j][k] -            # 合計kが大きければ、増やせるかもしれないので、選んだ数と合計を減らしたところを見に行く -            # 選べる数j=0は論外だし、添え字[j-1]に良くないので条件で除外する -            elif k >= xN[i - 1] and j > 0: -                dp[i][j][k] = dp[i - 1][j][k] + dp[i - 1][j - 1][k - xN[i - 1]] -            # 選んだ数と合計から判断して、平均が条件に合うものなら答えに足す -            if i == N and j > 0 and k == j * A: -                ans += dp[i][j][k] -# ans = 0 -# for k in range(1,N+1): -#     ans += dp[N][k][k*A] -print(ans) +    for t in range(2 * N * X + 1): +        # 範囲外ならそのまま +        if t - yN[i - 1] < 0 or t - yN[i - 1] > 2 * N * X: +            dp[i][t] = dp[i - 1][t] +        # 範囲内なら前の値を足す +        elif 0 <= t - yN[i - 1] <= 2 * N * X: +            dp[i][t] = dp[i - 1][t] + dp[i - 1][t - yN[i - 1]] +# 1枚も選ばないパターンを引く +print((dp[N][N * X] - 1))