思路:没想到吧,又考组合数学了。首先分析题意,题目说了给定的输入为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()

京公网安备 11010502036488号