fun main(args: Array<String>) {
    val (n, a) = readLine()!!.split(" ").map { it.toInt() }
    var inputs = readLine()!!.split(" ").map { it.toInt() }.toMutableList()

    // N 枚の inputs から 任意の枚数を選んで平均を a にしたい
    // 何通りあるか？
    // 動的計画法

    // 目標平均値からの差分に直す
    val diffs = inputs.map { it - a }

    // 二次元 dp
    // どんな前提があれば答えを出せるか　を考える ( i 枚目まで考えたときに合計が j になっているパターン数 -> i+1 枚目までで考えたときの合計が j になっているパターン数
    // dp[i][j] = dp[i-1][j-xi] + dp[i-1][j] かと
    // j は -50*50 ~ 50*50 で出せば良い & i も ~ 50 -> 5000 * 50 = 250000 のメモ配列

    // i = 0 の場合の行を追加， j = 2500 が合計 0 に対応
    val dp = Array(51) { LongArray(5001) { 0 } }
    dp[0][2500] = 1

    // WA: input のインデックスも dp に合わせて 1スタートにしなくてはいけない
    // WA: diffs ではなく inputs を使ってしまっていた omg
    val diffsReIndexed = mutableListOf(0)
    diffsReIndexed.addAll(diffs)

    // WA: dp のインデックスがうまく合わせづらい
    // -2500 ~ 2500 を 0 ~ 5000 にシフトした状態で答えを求める
    // 更新される値が 2500 番目付近に入るため，デバッガーで確認しづらい -> これが一番の問題・・・
    // 負のインデックスを考えたほうがやりやすいか？？ 結局同じか
    for (i in 1 until n + 1) {
        for (j in 0 until 5001) {

            // println("$i $j")
            // WA: インデックスが 0 以上の場合しか考慮しておらず 5001 以上になる場合を考慮できていなかった
            if (j-diffsReIndexed[i] in 0..5000 ) {
                dp[i][j] = dp[i-1][j-diffsReIndexed[i]] + dp[i-1][j]
            } else {
                dp[i][j] = dp[i-1][j]
            }
        }
    }

//    // デバッグ出力
//    for (i in 0 until n+1) {
//        for ( j in 0 until 5001) {
//            if(dp[i][j] > 0) {
//                println("$i $j")
//                println(dp[i][j])
//            }
//        }
//    }

    // WA: 何故か答えが 1 大きい -> 最初の 0 枚で 0 のときに初期値として入れた 1 が影響している
    // dp として答えを出す際には必要だが，最終的な答えからは差し引く必要がある
    println(dp[n][2500] - 1)
}