#include <iostream>
#include <vector>
using namespace std;
const int MOD = 1e9 + 7;
const int MAXN = 500005;
long long fact[MAXN], inv[MAXN];
long long power(long long base, long long exp) {
long long res = 1;
base %= MOD;
while (exp > 0) {
if (exp % 2 == 1) res = (res * base) % MOD;
base = (base * base) % MOD;
exp /= 2;
}
return res;
}
long long modInverse(long long n) {
return power(n, MOD - 2);
}
void precompute() {
fact[0] = 1;
inv[0] = 1;
for (int i = 1; i < MAXN; i++) {
fact[i] = (fact[i - 1] * i) % MOD;
}
inv[MAXN - 1] = modInverse(fact[MAXN - 1]);
for (int i = MAXN - 2; i >= 1; i--) {
inv[i] = (inv[i + 1] * (i + 1)) % MOD;
}
}
long long nCr(int n, int r) {
if (r < 0 || r > n) return 0;
return fact[n] * inv[r] % MOD * inv[n - r] % MOD;
}
long long solve(int L, int R, const vector<long long>& a) {
if (L > R) return 1;
int m = -1;
for (int i = 0; L + i <= R - i; ++i) {
if (a[L + i] == 1LL * (i + 1) * (R - (L + i) + 1)) {
m = L + i;
break;
}
if (a[R - i] == 1LL * (R - i - L + 1) * (i + 1)) {
m = R - i;
break;
}
}
if (m == -1) return 0;
long long left_ways = solve(L, m - 1, a);
if (left_ways == 0) return 0;
long long right_ways = solve(m + 1, R, a);
if (right_ways == 0) return 0;
long long ways = (left_ways * right_ways) % MOD;
ways = (ways * nCr(R - L, m - L)) % MOD;
return ways;
}
void run_case() {
int n;
cin >> n;
vector<long long> a(n + 1);
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
cout << solve(1, n, a) << "\n";
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
precompute();
int t;
cin >> t;
while (t--) {
run_case();
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNvbnN0IGludCBNT0QgPSAxZTkgKyA3Owpjb25zdCBpbnQgTUFYTiA9IDUwMDAwNTsKCmxvbmcgbG9uZyBmYWN0W01BWE5dLCBpbnZbTUFYTl07Cgpsb25nIGxvbmcgcG93ZXIobG9uZyBsb25nIGJhc2UsIGxvbmcgbG9uZyBleHApIHsKICAgIGxvbmcgbG9uZyByZXMgPSAxOwogICAgYmFzZSAlPSBNT0Q7CiAgICB3aGlsZSAoZXhwID4gMCkgewogICAgICAgIGlmIChleHAgJSAyID09IDEpIHJlcyA9IChyZXMgKiBiYXNlKSAlIE1PRDsKICAgICAgICBiYXNlID0gKGJhc2UgKiBiYXNlKSAlIE1PRDsKICAgICAgICBleHAgLz0gMjsKICAgIH0KICAgIHJldHVybiByZXM7Cn0KCmxvbmcgbG9uZyBtb2RJbnZlcnNlKGxvbmcgbG9uZyBuKSB7CiAgICByZXR1cm4gcG93ZXIobiwgTU9EIC0gMik7Cn0KCnZvaWQgcHJlY29tcHV0ZSgpIHsKICAgIGZhY3RbMF0gPSAxOwogICAgaW52WzBdID0gMTsKICAgIGZvciAoaW50IGkgPSAxOyBpIDwgTUFYTjsgaSsrKSB7CiAgICAgICAgZmFjdFtpXSA9IChmYWN0W2kgLSAxXSAqIGkpICUgTU9EOwogICAgfQogICAgaW52W01BWE4gLSAxXSA9IG1vZEludmVyc2UoZmFjdFtNQVhOIC0gMV0pOwogICAgZm9yIChpbnQgaSA9IE1BWE4gLSAyOyBpID49IDE7IGktLSkgewogICAgICAgIGludltpXSA9IChpbnZbaSArIDFdICogKGkgKyAxKSkgJSBNT0Q7CiAgICB9Cn0KCmxvbmcgbG9uZyBuQ3IoaW50IG4sIGludCByKSB7CiAgICBpZiAociA8IDAgfHwgciA+IG4pIHJldHVybiAwOwogICAgcmV0dXJuIGZhY3Rbbl0gKiBpbnZbcl0gJSBNT0QgKiBpbnZbbiAtIHJdICUgTU9EOwp9Cgpsb25nIGxvbmcgc29sdmUoaW50IEwsIGludCBSLCBjb25zdCB2ZWN0b3I8bG9uZyBsb25nPiYgYSkgewogICAgaWYgKEwgPiBSKSByZXR1cm4gMTsKICAgIAogICAgaW50IG0gPSAtMTsKICAgIGZvciAoaW50IGkgPSAwOyBMICsgaSA8PSBSIC0gaTsgKytpKSB7CiAgICAgICAgaWYgKGFbTCArIGldID09IDFMTCAqIChpICsgMSkgKiAoUiAtIChMICsgaSkgKyAxKSkgewogICAgICAgICAgICBtID0gTCArIGk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZiAoYVtSIC0gaV0gPT0gMUxMICogKFIgLSBpIC0gTCArIDEpICogKGkgKyAxKSkgewogICAgICAgICAgICBtID0gUiAtIGk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KICAgIAogICAgaWYgKG0gPT0gLTEpIHJldHVybiAwOwoKICAgIGxvbmcgbG9uZyBsZWZ0X3dheXMgPSBzb2x2ZShMLCBtIC0gMSwgYSk7CiAgICBpZiAobGVmdF93YXlzID09IDApIHJldHVybiAwOyAKICAgIAogICAgbG9uZyBsb25nIHJpZ2h0X3dheXMgPSBzb2x2ZShtICsgMSwgUiwgYSk7CiAgICBpZiAocmlnaHRfd2F5cyA9PSAwKSByZXR1cm4gMDsgCgogICAgbG9uZyBsb25nIHdheXMgPSAobGVmdF93YXlzICogcmlnaHRfd2F5cykgJSBNT0Q7CiAgICB3YXlzID0gKHdheXMgKiBuQ3IoUiAtIEwsIG0gLSBMKSkgJSBNT0Q7CiAgICAKICAgIHJldHVybiB3YXlzOwp9Cgp2b2lkIHJ1bl9jYXNlKCkgewogICAgaW50IG47CiAgICBjaW4gPj4gbjsKICAgIHZlY3Rvcjxsb25nIGxvbmc+IGEobiArIDEpOwogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSB7CiAgICAgICAgY2luID4+IGFbaV07CiAgICB9CiAgICBjb3V0IDw8IHNvbHZlKDEsIG4sIGEpIDw8ICJcbiI7Cn0KCmludCBtYWluKCkgewogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKE5VTEwpOwogICAgcHJlY29tcHV0ZSgpOwogICAgCiAgICBpbnQgdDsKICAgIGNpbiA+PiB0OwogICAgd2hpbGUgKHQtLSkgewogICAgICAgIHJ1bl9jYXNlKCk7CiAgICB9CiAgICAKICAgIHJldHVybiAwOwp9