组合数哭唧唧
前言:手写一个简单的组合数,但是由于长期没写,导致一些细节没处理好
题目链接
#include<bits/stdc++.h>
using namespace std;
#define endl "\n"#define int long longconst 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;}}