#include <iostream>
#include<algorithm>
#include<cmath>
using namespace std;

typedef long long ll; 

const ll p = 1000000007;
const ll biggest = 200009; 
ll factorial[biggest], inverse[biggest];


ll fast_pow_mod(ll base, ll exp, ll p) {
	if (base == 0) return 0;
	ll ans = 1;
	while (exp > 0) {
		if(exp & 1) ans = (ans * base) % p;
		base = (base * base) % p;
		exp >>= 1;
	}
	return ans;
}

ll calcu_c(ll base, ll exp, ll p) {
	return ((factorial[base] * inverse[exp] % p) * inverse[base - exp]) % p; 
} 
//计算方法简单,但是对于对于取1的数量的约束较多,建议直接用代数理解
//0 <= i <= m, 0 <= subLen - i <= n, subLen / 2 + 1 <= i综合上述式子得到对于i的约束
int main() {
	//预处理
	factorial[0] = 1;
	factorial[1] = 1;
	for (int i = 2;i <= biggest; i++) {
		factorial[i] = factorial[i - 1] * i % p;
	}
	for (int i = 0; i <= biggest; i ++) {
		inverse[i] = fast_pow_mod(factorial[i], p - 2, p);
	} 
	int t;
	cin >> t;
	while (t-- > 0) {
		ll len, subLen, m = 0, n, ans = 0;
		cin >> len >> subLen;
		int tmp;
		for (int i = 0;i < len; i++) {
			cin >> tmp;
			m += tmp; 
		}
		n = len - m;
		ll left = max(subLen - n, subLen / 2 + 1);
		ll right = min(m, subLen);
		for (int i = left; i <= right; i++) {
			ans = (ans + (calcu_c(m, i, p) * calcu_c(n, subLen - i, p) % p)) % p;
		}
		cout << ans << endl;
	}
}