前言:手写一个简单的组合数,但是由于长期没写,导致一些细节没处理好
题目链接

#include<bits/stdc++.h>
using namespace std;
#define endl "\n"
#define int long long
const int N = (int)2e5+10;
const int Mod = (int)1e9+7;
int a[N]; // 处理阶乘 
int n,k;
void fun(){
	a[1] = 1; 
	a[0] = 1;  // 这个不能漏掉 ,这个很关键
	for(int i=2;i<N;i++){
		a[i] = (a[i-1]*i)%Mod;
	}
}
int pow(int x,int p){
	int tmp = 1;
	while(p){
		if(p&1) tmp =tmp* x%Mod;
		x = x*x%Mod;
		p >>=1;
	}
	return tmp;
}
int chu(int nn,int kk){
	if(nn<kk) return 0LL;
	return (a[nn]%Mod)*(pow(a[nn-kk]*a[kk]%Mod,Mod-2)%Mod)%Mod;
} 
signed main(){
	fun();
	
	int t;
	cin >> t;
	while(t--){
		cin >> n >> k;
		int b;
		int cnt = 0;
		for(int i=1;i<=n;i++){
			cin >> b;
			if(b){
				cnt += 1;
			}
		}
		int ans = 0;
		for(int i=k/2+1;i<=min(k,cnt);i++){
			ans =(ans+ chu(cnt,i)*chu(n-cnt,k-i))%Mod;
		}
		cout << ans << endl;
	}
}
                


















