思路:没想到吧,又考组合数学了。首先分析题意,题目说了给定的输入为2进制数组,要在只有0和1的数中找中位数,那只需要统计1的数量即可,如果1的数量,说明长为k的子序列中,有一半以上为1,中位数就是1;否则中位数就是0

然后,我们把三个经典的东西写上:1.取mod的阶乘数组fac;2.逆元函数inv;3.组合数学函数comb。接下来就可以枚举1的数量了,为了保证中位数是1,那我们至少要个1,这是下限;然后上限为也就是整个数组的长度和最大的1个数取更小的一方

接下来,我们不断累加当前枚举数量1时的结果,即,并且不断取mod,最终输出答案即可

往期每日一题考过的组合数学题:

1.计数 https://www.nowcoder.com/practice/e91f8e9c0b1f4df69d5d0814e173266c?channelPut=tracker2

2.小红的好排列 https://www.nowcoder.com/practice/67bf8c0b7fc64f3bb9cc21bf6dbbd14f?channelPut=tracker2

代码:

import sys
input = lambda: sys.stdin.readline().strip()

import math
inf = 10 ** 18

def I():
    return input()

def II():
    return int(input())

def MII():
    return map(int, input().split())

def GMI():
    return map(lambda x: int(x) - 1, input().split())

def LI():
    return input().split()

def LII():
    return list(map(int, input().split()))

def LFI():
    return list(map(float, input().split()))

fmax = lambda x, y: x if x > y else y
fmin = lambda x, y: x if x < y else y
isqrt = lambda x: int(math.sqrt(x))

'''

'''

mod = 10 ** 9 + 7

MAXN = 2 * 10 ** 5
fac = [1] * (MAXN + 1)
for i in range(2, MAXN + 1):
    fac[i] = fac[i - 1] * i % mod

def inv(x):
    return pow(x, mod - 2, mod)

def comb(a, b):
    if a < b:
        return 0
    return fac[a] * inv(fac[b]) * inv(fac[a - b]) % mod

def solve():
    n, k = MII()
    a = LII()

    s = sum(a)
    ones, zeros = s, n - s
    needs = (k + 1) // 2

    ans = 0
    for i in range(needs, min(k, ones) + 1):
        ans = (ans + comb(ones, i) * comb(zeros, k - i)) % mod
    print(ans)

# t = 1
t = II()
for _ in range(t):
    solve()