/* ID: espr1t TASK: KEYWORDS: */ #include #include #include #include #include using namespace std; FILE *in; FILE *out; const int MAX = 2000002; const int MOD = 1000000007; int fact[MAX]; long long fastPow(long long num, long long pwr) { long long ret = 1; while (pwr) { if (pwr & 1LL) ret = (ret * num) % MOD; num = (num * num) % MOD; pwr /= 2LL; } return ret; } long long comb(int n, int k) { long long ret = fact[n]; ret = (ret * fastPow(fact[k], MOD - 2)) % MOD; ret = (ret * fastPow(fact[n - k], MOD - 2)) % MOD; return ret; } long long cat(int n) { long long ret = comb(2 * n, n); ret = (ret * fastPow(n + 1, MOD - 2)) % MOD; return ret; } int main(void) { in = stdin; out = stdout; in = fopen("brackets.in", "rt"); out = fopen("brackets.out", "wt"); fact[0] = 1; for (int i = 1; i < MAX; i++) fact[i] = ((long long)fact[i - 1] * i) % MOD; int numTests; fscanf(in, "%d", &numTests); for (int test = 0; test < numTests; test++) { int k; fscanf(in, "%d", &k); long long ans = 1, sum = 0; for (int i = 0; i < k; i++) { int cnt; fscanf(in, "%d", &cnt); sum += cnt; ans = (ans * comb(sum, cnt)) % MOD; /* ans = (ans * comb(sum, cnt)) % MOD; ans = (ans * cat(cnt)) % MOD; */ } ans = (ans * cat(sum)) % MOD; fprintf(out, "%lld\n", ans); } return 0; }