#include <bits/stdc++.h>
using ll = long long;
using ld = long double;
using ull = unsigned long long;
using namespace std;
template <class T>
using Ve = vector<T>;
#define ALL(v) (v).begin(), (v).end()
#define pii pair<ll, ll>
#define rep(i, a, b) for(ll i = (a); i <= (b); ++i)
#define per(i, a, b) for(ll i = (a); i >= (b); --i)
#define pb push_back
bool Mbe;
ll read() {
ll x = 0, f = 1; char ch = getchar();
while(ch < '0' || ch > '9') {if(ch == '-') f = -1; ch = getchar();}
while(ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar();
return x * f;
}
void write(ll x) {
if(x < 0) putchar('-'), x = -x;
if(x > 9) write(x / 10);
putchar(x % 10 + '0');
}
const ll N = 4e6 + 9, Mod = 1e9 + 7, inv2 = (Mod + 1) / 2;
ll n, a[N], fac[N], ifac[N], ipw2[N];
ll pw(ll x, ll p) {
ll res = 1;
while(p) {
if(p & 1) res = res * x % Mod;
x = x * x % Mod, p >>= 1;
}
return res;
}
void Init(ll n) {
fac[0] = 1;
rep(i, 1, n) fac[i] = fac[i - 1] * i % Mod;
ifac[n] = pw(fac[n], Mod - 2);
per(i, n - 1, 0) ifac[i] = ifac[i + 1] * (i + 1) % Mod;
ipw2[0] = 1;
rep(i, 1, n) ipw2[i] = ipw2[i - 1] * inv2 % Mod;
}
ll C(ll x, ll y) {
if(x < y || y < 0) return 0;
return fac[x] * ifac[y] % Mod * ifac[x - y] % Mod;
}
ll ext[N], bg[N], ok[N], pre[N];
void solve() {
n = read();
ll sta = 0;
rep(i, 1, n * 2) a[i] = read(), sta |= (1 << a[i]);
if((sta & 1) && (sta & 4)) return puts("0"), void();
if(sta == 1 || sta == 4) {
ll ans = 0;
// (4n, 4n - 1) 同一个人
ll res = n * fac[4 * n - 2] % Mod * ipw2[2 * n - 1] % Mod;
ans = (ans + res) % Mod;
// (4n, 4n - 1) 不同人
res = n * (n - 1) % Mod * fac[4 * n - 2] % Mod * ipw2[2 * n - 2] % Mod;
ans = (ans + res) % Mod;
write(ans), putchar('\n');
return ;
}
if(sta == 2) {
ll ans = 0;
// 有 4n, 无 4n - 1,无 4n - 2
ll res = n * n % Mod * fac[4 * n - 3] % Mod * ipw2[2 * n - 2] % Mod;
ans = (ans + res) % Mod;
res = n * n % Mod * (n - 1) % Mod * fac[4 * n - 3] % Mod * ipw2[2 * n - 3] % Mod;
ans = (ans + res) % Mod;
ans = ans * 2 % Mod;
write(ans), putchar('\n');
return ;
}
if(sta & 1) {
rep(i, 1, n * 2) a[i] = 2 - a[i];
ll v = a[1];
rep(i, 2, n * 2) a[i - 1] = a[i];
a[n * 2] = v;
}
rep(i, 1, n * 2) a[i + n * 2] = a[i];
rep(i, 0, n * 4 + 1) pre[i] = ext[i] = bg[i] = ok[i] = 0;
rep(i, 1, n * 4) {
pre[i] = 1;
if(a[i] == a[i - 1]) pre[i] = pre[i - 1] + 1;
}
per(i, n * 4, 1) {
ext[i] = 1;
if(i < n * 4 && a[i + 1] == a[i]) ext[i] = ext[i + 1] + 1;
if(a[i] != a[i - 1]) bg[i] = 1, ok[i] = (ext[i] & 1);
else ok[i] = 1;
}
// rep(i, 1, n * 4) cout << a[i] << " ";
// cout << endl;
// rep(i, 1, n * 4) cout << bg[i] << " ";
// cout << endl;
// rep(i, 1, n * 4) cout << ok[i] << " ";
// cout << endl;
rep(i, 1, n * 4) bg[i] += bg[i - 1], ok[i] += ok[i - 1];
ll ans = 0;
rep(i, n * 2 + 1, n * 4) {
if(a[i] == 2) continue;
if(i & 1) continue;
ll cnt = bg[i] - bg[i - 2 * n];
if(a[i - 2 * n + 1] == a[i - 2 * n]) ++cnt;
if(cnt == 2 * n) {
// 取决于剩下的 max
ans = (ans + n * fac[2 * n - 1]) % Mod;
continue;
}
ll lst = ext[i - 2 * n + 1];
// if(!(lst & 1)) continue;
if(!(pre[i] & 1)) continue;
ll p = i - pre[i];
ll sok = ok[p] - ok[i - 2 * n];
if(sok != p - (i - 2 * n)) continue;
ll c1 = lst / 2, c2 = cnt / 2, c3 = n - c1 - c2;
// x 直接在后面了
ans = (ans + c2 * fac[4 * n - cnt - 1] % Mod * ipw2[2 * n - cnt]) % Mod;
ans = (ans + c3 * fac[4 * n - cnt - 1] % Mod * ipw2[2 * n - cnt - 1]) % Mod;
// 在前面,然后 x-1 补刀
ans = (ans + c1 * (c1 + c3 - 1) % Mod * fac[4 * n - cnt - 2] % Mod * ipw2[2 * n - cnt - 2]) % Mod;
ans = (ans + c1 * (c2 + 1) % Mod * fac[4 * n - cnt - 2] % Mod * ipw2[2 * n - cnt - 1]) % Mod;
// cout << ans << endl;
}
write(ans), putchar('\n');
}
bool Med;
int main() {
// freopen("B.in", "r", stdin);
// freopen("B2.out", "w", stdout);
cerr << fabs(&Med - &Mbe) / 1048576.0 << "MB\n";
ll T = read();
Init(4e6);
while(T--) solve();
cerr << "\n" << clock() * 1.0 / CLOCKS_PER_SEC * 1000 << "ms\n";
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 | #include <bits/stdc++.h> using ll = long long; using ld = long double; using ull = unsigned long long; using namespace std; template <class T> using Ve = vector<T>; #define ALL(v) (v).begin(), (v).end() #define pii pair<ll, ll> #define rep(i, a, b) for(ll i = (a); i <= (b); ++i) #define per(i, a, b) for(ll i = (a); i >= (b); --i) #define pb push_back bool Mbe; ll read() { ll x = 0, f = 1; char ch = getchar(); while(ch < '0' || ch > '9') {if(ch == '-') f = -1; ch = getchar();} while(ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar(); return x * f; } void write(ll x) { if(x < 0) putchar('-'), x = -x; if(x > 9) write(x / 10); putchar(x % 10 + '0'); } const ll N = 4e6 + 9, Mod = 1e9 + 7, inv2 = (Mod + 1) / 2; ll n, a[N], fac[N], ifac[N], ipw2[N]; ll pw(ll x, ll p) { ll res = 1; while(p) { if(p & 1) res = res * x % Mod; x = x * x % Mod, p >>= 1; } return res; } void Init(ll n) { fac[0] = 1; rep(i, 1, n) fac[i] = fac[i - 1] * i % Mod; ifac[n] = pw(fac[n], Mod - 2); per(i, n - 1, 0) ifac[i] = ifac[i + 1] * (i + 1) % Mod; ipw2[0] = 1; rep(i, 1, n) ipw2[i] = ipw2[i - 1] * inv2 % Mod; } ll C(ll x, ll y) { if(x < y || y < 0) return 0; return fac[x] * ifac[y] % Mod * ifac[x - y] % Mod; } ll ext[N], bg[N], ok[N], pre[N]; void solve() { n = read(); ll sta = 0; rep(i, 1, n * 2) a[i] = read(), sta |= (1 << a[i]); if((sta & 1) && (sta & 4)) return puts("0"), void(); if(sta == 1 || sta == 4) { ll ans = 0; // (4n, 4n - 1) 同一个人 ll res = n * fac[4 * n - 2] % Mod * ipw2[2 * n - 1] % Mod; ans = (ans + res) % Mod; // (4n, 4n - 1) 不同人 res = n * (n - 1) % Mod * fac[4 * n - 2] % Mod * ipw2[2 * n - 2] % Mod; ans = (ans + res) % Mod; write(ans), putchar('\n'); return ; } if(sta == 2) { ll ans = 0; // 有 4n, 无 4n - 1,无 4n - 2 ll res = n * n % Mod * fac[4 * n - 3] % Mod * ipw2[2 * n - 2] % Mod; ans = (ans + res) % Mod; res = n * n % Mod * (n - 1) % Mod * fac[4 * n - 3] % Mod * ipw2[2 * n - 3] % Mod; ans = (ans + res) % Mod; ans = ans * 2 % Mod; write(ans), putchar('\n'); return ; } if(sta & 1) { rep(i, 1, n * 2) a[i] = 2 - a[i]; ll v = a[1]; rep(i, 2, n * 2) a[i - 1] = a[i]; a[n * 2] = v; } rep(i, 1, n * 2) a[i + n * 2] = a[i]; rep(i, 0, n * 4 + 1) pre[i] = ext[i] = bg[i] = ok[i] = 0; rep(i, 1, n * 4) { pre[i] = 1; if(a[i] == a[i - 1]) pre[i] = pre[i - 1] + 1; } per(i, n * 4, 1) { ext[i] = 1; if(i < n * 4 && a[i + 1] == a[i]) ext[i] = ext[i + 1] + 1; if(a[i] != a[i - 1]) bg[i] = 1, ok[i] = (ext[i] & 1); else ok[i] = 1; } // rep(i, 1, n * 4) cout << a[i] << " "; // cout << endl; // rep(i, 1, n * 4) cout << bg[i] << " "; // cout << endl; // rep(i, 1, n * 4) cout << ok[i] << " "; // cout << endl; rep(i, 1, n * 4) bg[i] += bg[i - 1], ok[i] += ok[i - 1]; ll ans = 0; rep(i, n * 2 + 1, n * 4) { if(a[i] == 2) continue; if(i & 1) continue; ll cnt = bg[i] - bg[i - 2 * n]; if(a[i - 2 * n + 1] == a[i - 2 * n]) ++cnt; if(cnt == 2 * n) { // 取决于剩下的 max ans = (ans + n * fac[2 * n - 1]) % Mod; continue; } ll lst = ext[i - 2 * n + 1]; // if(!(lst & 1)) continue; if(!(pre[i] & 1)) continue; ll p = i - pre[i]; ll sok = ok[p] - ok[i - 2 * n]; if(sok != p - (i - 2 * n)) continue; ll c1 = lst / 2, c2 = cnt / 2, c3 = n - c1 - c2; // x 直接在后面了 ans = (ans + c2 * fac[4 * n - cnt - 1] % Mod * ipw2[2 * n - cnt]) % Mod; ans = (ans + c3 * fac[4 * n - cnt - 1] % Mod * ipw2[2 * n - cnt - 1]) % Mod; // 在前面,然后 x-1 补刀 ans = (ans + c1 * (c1 + c3 - 1) % Mod * fac[4 * n - cnt - 2] % Mod * ipw2[2 * n - cnt - 2]) % Mod; ans = (ans + c1 * (c2 + 1) % Mod * fac[4 * n - cnt - 2] % Mod * ipw2[2 * n - cnt - 1]) % Mod; // cout << ans << endl; } write(ans), putchar('\n'); } bool Med; int main() { // freopen("B.in", "r", stdin); // freopen("B2.out", "w", stdout); cerr << fabs(&Med - &Mbe) / 1048576.0 << "MB\n"; ll T = read(); Init(4e6); while(T--) solve(); cerr << "\n" << clock() * 1.0 / CLOCKS_PER_SEC * 1000 << "ms\n"; return 0; } |
English