unittest
{
	assert( [ "4 8", "7 9 8 9" ].parse.expand.solve == 5 );
	assert( [ "3 8", "6 6 9" ].parse.expand.solve == 0 );
	assert( [ "8 5", "3 6 2 8 7 6 5 9" ].parse.expand.solve == 19 );
	assert( [ "33 3", "3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3" ].parse.expand.solve == 8589934591 );
}



import std.algorithm;
import std.conv;
import std.functional;
import std.range;
import std.stdio;
import std.typecons;

void main()
{
	stdin.byLineCopy.parse.expand.solve.writeln;
}

auto parse( Range )( Range input )
if( isInputRange!Range && is( ElementType!Range == string ) )
{
	auto na = input.front.split.to!( long[] );
	input.popFront;
	auto xs = input.front.split.to!( long[] );
	return tuple( na[ 1 ], xs );
}

auto solve( long a, long[] xs )
{
	// 平均未満、平均、平均超のグループに分割
	xs.sort();
	auto ls = xs[ 0 .. $ - xs.find!( ( x ) => a <= x ).length ];
	auto cs = xs[ ls.length .. $ - xs.find!( ( x ) => a < x ).length ];
	auto rs = xs[ ls.length + cs.length .. $ ];
	
	// aからの相対値に変換
	foreach( ref l; ls )
	{
		l -= a;
	}
	foreach( ref r; rs )
	{
		r -= a;
	}
	
	// 各グループ内の組み合わせ数を計算（aからの相対値をキーにした連想配列で集計）
	auto lks = f( ls );
	auto cks = f( cs );
	auto rks = f( rs );
	
	// aからの相対値が0（＝1枚も選ばないパターン）は除外
	lks.remove( 0 );
	cks.remove( 0 );
	rks.remove( 0 );
	
	// 平均値グループ内の組み合わせ数を合計
	auto ans = cks.values.sum;
	
	// 平均値未満グループ×平均値超グループ×平均値グループの組み合わせ数を計算
	foreach( i; rks.keys )
	{
		if( -i !in lks ) continue;		// 平均からの相対値が同じではないやつは組みあわせても平均値にならないので除外
		ans += lks[ -i ] * rks[ i ] * ( cks[ a ] + 1 );		// 最後に1足してるのは平均値グループから1枚も選ばないパターン
	}
	return ans;
}

long[ long ] f( long[] xs )
{
	if( xs.length == 0 ) return [ 0L:1L ];
	
	long[ long ] ans;
	ans = u( ans,       0, memoize!f( xs[ 1 .. $ ] ) );		// 先頭の一枚を選ばないパターン
	ans = u( ans, xs[ 0 ], memoize!f( xs[ 1 .. $ ] ) );		// 先頭の一枚を選ぶパターン
	return ans;
}

long[ long ] u( long[ long ] xs, long b, long[ long ] ys )
{
	foreach( i, y; ys )
	{
		xs[ i + b ] += y;
	}
	return xs;
}
