#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define mem(a, b) memset(a, b, sizeof(a))
#define read(x) \
for (auto &it : x) \
cin >> it;
#define write(x) \
for (auto it : x) \
cout << it << " ";
const int MOD = 1e9 + 7;
ll arr[200008];
ll power(ll base, ll exp)
{
int result = 1;
base %= MOD;
while (exp > 0)
{
if (exp % 2 == 1)
{
result = (result * base) % MOD;
}
base = (base * base) % MOD;
exp /= 2;
}
return result;
}
ll modInverse(ll a)
{
return power(a, MOD - 2); ////power is the function for binary_exponentiation
}
ll nCr(int n, int r)
{
if (r > n)
return 0LL;
return (arr[n] * modInverse(((arr[r]) * arr[n - r]) % MOD)) % MOD;
}
int32_t main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
arr[0] = 1;
for (int i = 1; i <= 200005; i++)
{
arr[i] = (arr[i - 1] * i) % MOD;
}
ll t;
cin >> t;
while (t--)
{
ll n, k;
cin >> n >> k;
vector<int> v(n);
read(v) ll x = 0, y = 0;
for (int i = 0; i < n; i++)
{
if (v[i])
x++;
else
y++;
}
ll f = (k / 2) + 1;
ll sum = 0;
for (ll i = f; i <= min(k, x); i++)
{
ll ff = (nCr(x, i) * nCr(y, k - i)) % MOD;
sum = (sum + ff) % MOD;
}
cout << sum << endl;
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgbGwgbG9uZyBsb25nCiNkZWZpbmUgZW5kbCAnXG4nCiNkZWZpbmUgYWxsKHgpIHguYmVnaW4oKSwgeC5lbmQoKQojZGVmaW5lIHJhbGwoeCkgeC5yYmVnaW4oKSwgeC5yZW5kKCkKI2RlZmluZSBtZW0oYSwgYikgbWVtc2V0KGEsIGIsIHNpemVvZihhKSkKI2RlZmluZSByZWFkKHgpICAgICAgICBcCiAgICBmb3IgKGF1dG8gJml0IDogeCkgXAogICAgICAgIGNpbiA+PiBpdDsKI2RlZmluZSB3cml0ZSh4KSAgICAgIFwKICAgIGZvciAoYXV0byBpdCA6IHgpIFwKICAgICAgICBjb3V0IDw8IGl0IDw8ICIgIjsKY29uc3QgaW50IE1PRCA9IDFlOSArIDc7CmxsIGFyclsyMDAwMDhdOwoKbGwgcG93ZXIobGwgYmFzZSwgbGwgZXhwKQp7CiAgICBpbnQgcmVzdWx0ID0gMTsKICAgIGJhc2UgJT0gTU9EOwogICAgd2hpbGUgKGV4cCA+IDApCiAgICB7CiAgICAgICAgaWYgKGV4cCAlIDIgPT0gMSkKICAgICAgICB7CiAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKiBiYXNlKSAlIE1PRDsKICAgICAgICB9CiAgICAgICAgYmFzZSA9IChiYXNlICogYmFzZSkgJSBNT0Q7CiAgICAgICAgZXhwIC89IDI7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0Owp9CgpsbCBtb2RJbnZlcnNlKGxsIGEpCnsKICAgIHJldHVybiBwb3dlcihhLCBNT0QgLSAyKTsgLy8vL3Bvd2VyIGlzIHRoZSBmdW5jdGlvbiBmb3IgYmluYXJ5X2V4cG9uZW50aWF0aW9uCn0KbGwgbkNyKGludCBuLCBpbnQgcikKewogICAgaWYgKHIgPiBuKQogICAgICAgIHJldHVybiAwTEw7CgogICAgcmV0dXJuIChhcnJbbl0gKiBtb2RJbnZlcnNlKCgoYXJyW3JdKSAqIGFycltuIC0gcl0pICUgTU9EKSkgJSBNT0Q7Cn0KaW50MzJfdCBtYWluKCkKewogICAgaW9zOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwogICAgY2luLnRpZShOVUxMKTsKCiAgICBhcnJbMF0gPSAxOwogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gMjAwMDA1OyBpKyspCiAgICB7CiAgICAgICAgYXJyW2ldID0gKGFycltpIC0gMV0gKiBpKSAlIE1PRDsKICAgICAgICB9CgogICAgbGwgdDsKICAgIGNpbiA+PiB0OwogICAgd2hpbGUgKHQtLSkKICAgIHsKICAgICAgICBsbCBuLCBrOwogICAgICAgIGNpbiA+PiBuID4+IGs7CiAgICAgICAgdmVjdG9yPGludD4gdihuKTsKICAgICAgICByZWFkKHYpIGxsIHggPSAwLCB5ID0gMDsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIGlmICh2W2ldKQogICAgICAgICAgICAgICAgeCsrOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB5Kys7CiAgICAgICAgfQoKICAgICAgICBsbCBmID0gKGsgLyAyKSArIDE7CgogICAgICAgIGxsIHN1bSA9IDA7CiAgICAgICAgZm9yIChsbCBpID0gZjsgaSA8PSBtaW4oaywgeCk7IGkrKykKCiAgICAgICAgewoKICAgICAgICAgICAgbGwgZmYgPSAobkNyKHgsIGkpICogbkNyKHksIGsgLSBpKSkgJSBNT0Q7CiAgICAgICAgICAgIHN1bSA9IChzdW0gKyBmZikgJSBNT0Q7CiAgICAgICAgfQoKICAgICAgICBjb3V0IDw8IHN1bSA8PCBlbmRsOwogICAgfQoKICAgIHJldHVybiAwOwp9