前言:手写一个简单的组合数,但是由于长期没写,导致一些细节没处理好
题目链接
#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;
}
}