#include using namespace std; const int MaxN = (int)5e3 + 10; const int INF = (int)1e9; const int MOD = (int)1e9 + 7; int cnk[MaxN][MaxN]; int n, k, a[MaxN]; int mPow(int a, int n) { int r = 1; while (n > 0) { if (n & 1) { r = 1LL * r * a % MOD; } a = 1LL * a * a % MOD; n /= 2; } return r; } void solve() { scanf("%d%d", &n, &k); assert (1 <= n && n <= 5000); assert (1 <= k && k <= n); for (int i = 1; i <= n; ++i) { scanf("%d", &a[i]); } int ans = 1; if (k <= 2) { printf("0\n"); return; } sort(a + 1, a + n + 1); for (int i = 2; i + 1 <= n; ++i) { int cnt = 0; for (int l = 1; l <= i - 1; ++l) { int r = k - l - 1; if (r <= 0) { continue; } cnt = (cnt + 1LL * cnk[i - 1][l] * cnk[n - i][r]) % (MOD - 1); } ans = 1LL * ans * mPow(a[i], cnt) % MOD; } printf("%d\n", ans); } int main() { // freopen("input.txt", "r", stdin); for (int i = 0; i < MaxN; ++i) { cnk[i][0] = 1; for (int j = 1; j <= i; ++j) { cnk[i][j] = (cnk[i - 1][j - 1] + cnk[i - 1][j]) % (MOD - 1); } } int t; scanf("%d", &t); assert (1 <= t && t <= 10); while (t --> 0) { solve(); } return 0; }