#include <bits/stdc++.h>
using namespace std;
long long k,n,i,j,u,t,w,xp,xs,ax,ay;
int z,pp;
long long m,k1,k2,k3,k4;
vector<long long> x;
long long v[4000005];
long long f[4000005];
long long fv[4000005];
long long p[4000005];
long long pv[4000005];
int a[2000005];
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
m=1e9+7;
v[1] = 1;
for (i = 2; i <4000005LL; i++)
v[i] = (m - (m / i) * v[m % i] % m) % m;
f[0]=1;
p[0]=1;
pv[0]=1;
fv[0]=1;
for(i=1;i<=4000000LL;i++) {
f[i]=(f[i-1]*i)%m;
fv[i]=(fv[i-1]*v[i])%m;
p[i]=(p[i-1]<<1LL)%m;
pv[i]=(pv[i-1]*v[2])%m;
}
cin >> t;
for(u=0;u<t;u++) {
cin >> n;
z=0;
x={};
w=0;
for(i=0;i<2*n;i++) {
cin >> j;
a[i]=j;
if(j==2 and w==0) {w=1; pp=i;}
if(j==0 and w==0) {w=-1; pp=i;}
if(w==1 and j==0) w=-3;
if(w==-1 and j==2) w=-3;
if(j==1){
if(z<=0) z--;
else {if(z!=0) x.push_back(z); z=-1;}
}
if(j==2 or j==0) {
if(z>=0) z++;
else {if(z!=0) x.push_back(z); z=1;};
}
}
x.push_back(z);
if(x.size()>1 and x[0]*x[x.size()-1]>0) {
x[0]+=x[x.size()-1];
if(pp==0) {
for(i=2*n-1;(a[i]==0 || a[i]==2);i--);
pp=i+1;
}
x.pop_back();
}
if(x.size()>1)
for(auto xx:x) {if(xx%2==0) w=-3;}
if(w==-3) cout << "0\n";
else if(w==0) {
k=(((((2*n*n)%m)*((f[4*n-3]*pv[2*n-2])%m))%m)*(2*n-1))%m;
cout << k << '\n';
//cout << (((256223893LL*fv[4*n-3])%m)*p[2*n-2])%m << '\n';
continue;
}
else{
//for(auto xx:x)
//cout << xx <<' ';
//cout << '\n';
//cout << pp << "PP\n";
if(x.size()==1) {
//cout << ((f[4*n-2]*pv[2*n-1])%m) << '\n';
//cout << ((n*(2*n-1))%m) << '\n';
k=(f[4*n-2]*pv[2*n-1])%m;
k*=(n*(2*n-1))%m;
k%=m;
cout << k << "\n"; continue;}
if((pp%2 and w==1) or (pp%2==0 and w==-1)) { cout << 0 <<"\n"; continue;}
k1=0;
k2=0;
k3=0;
k4=0;
xs=x.size()/2;
for(auto xx: x) {
if(xx<0){
xp=-xx/2;
ax=((f[4*n-2*xs-2]*pv[2*n-2*xs-1])%m);
ax*=((xp*xs)%m);
k1+=ax%m; //xp*xs*f[4*n-2*xs-2]*pv[2*n-2*xs-1];
k1%=m;
if(n>xs) {
ax=(f[4*n-2*xs-2]*pv[2*n-2*xs-2])%m;
ax*=(n-xs+(m-((xp+1)*pv[1])%m))%m;
ax%=m;
k1+=(xp*ax)%m; //xp*(n-xs-(xp+1)*pv[2])*f[4*n-2*xs-2]*pv[2*n-2*xs-2];
k1%=m;
}
if(n>xs) {
ax=(f[4*n-2*xs-3]*pv[2*n-2*xs-1])%m;
ax*=(xp*(xp+1))%m;
ax%=m;
k2+=((xs+1)*ax); //(xs+1)*xp*(xp+1)*f[4*n-2*xs-3]*pv[2*n-2*xs];
k2%=m;
}
if(n>xs+1){
ax=(f[4*n-2*xs-3]*pv[2*n-2*xs-2])%m;
ax*=(xp*(xp+1))%m;
ax%=m;
k2+=(n-xs-1)*ax; //(n-xs-1)*xp*(xp+1)*f[4*n-xs-3]*pv[2*n-2*xs-1];
k2%=m;
}
}
else {
xp=xx/2;
ax=(f[4*n-2*xs-1]*pv[2*n-2*xs])%m;
k3+=xs*ax; //xs*f[4*n-2*xs-1]*pv[2*n-2*xs];
k3%=m;
if(n>xs){
ax=(f[4*n-2*xs-1]*pv[2*n-2*xs-1])%m;
k3+=(n-xp-xs)*ax; //(n-xp-xs)*f[4*n-2*xs-1]*pv[2*n-2*xs-1];
k3%=m;
}
if(n>xs){
ax=(f[4*n-2*xs-2]*pv[2*n-2*xs-1])%m;
ax*=((xs+1)*xp)%m;
ax%=m;
k4+=ax; //(xs+1)*xp*f[4*n-2*xs-2]*pv[2*n-2*xs-1];
k4%=m;
}
if(n>xs+1){
ax=(f[4*n-2*xs-2]*pv[2*n-2*xs-2])%m;
ax*=((n-xs-1)*xp)%m;
ax%=m;
k4+=ax;//(n-xs-1)*xp*f[4*n-xs-2]*pv[2*n-2*xs-2];
k4%=m;
}
}
}
//cout << k1 << ' '<< k2 << ' ' << k3 << ' ' << k4 << '\n';
cout << (k1+k2+k3+k4)%m << '\n';
//if((k1+k2+k3+k4)%m==126000) {
//for(j=0;j<2*n;j++) cout << a[j] << ' ';
//cout << '\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 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 | #include <bits/stdc++.h> using namespace std; long long k,n,i,j,u,t,w,xp,xs,ax,ay; int z,pp; long long m,k1,k2,k3,k4; vector<long long> x; long long v[4000005]; long long f[4000005]; long long fv[4000005]; long long p[4000005]; long long pv[4000005]; int a[2000005]; int main(){ ios_base::sync_with_stdio(0); cin.tie(0); m=1e9+7; v[1] = 1; for (i = 2; i <4000005LL; i++) v[i] = (m - (m / i) * v[m % i] % m) % m; f[0]=1; p[0]=1; pv[0]=1; fv[0]=1; for(i=1;i<=4000000LL;i++) { f[i]=(f[i-1]*i)%m; fv[i]=(fv[i-1]*v[i])%m; p[i]=(p[i-1]<<1LL)%m; pv[i]=(pv[i-1]*v[2])%m; } cin >> t; for(u=0;u<t;u++) { cin >> n; z=0; x={}; w=0; for(i=0;i<2*n;i++) { cin >> j; a[i]=j; if(j==2 and w==0) {w=1; pp=i;} if(j==0 and w==0) {w=-1; pp=i;} if(w==1 and j==0) w=-3; if(w==-1 and j==2) w=-3; if(j==1){ if(z<=0) z--; else {if(z!=0) x.push_back(z); z=-1;} } if(j==2 or j==0) { if(z>=0) z++; else {if(z!=0) x.push_back(z); z=1;}; } } x.push_back(z); if(x.size()>1 and x[0]*x[x.size()-1]>0) { x[0]+=x[x.size()-1]; if(pp==0) { for(i=2*n-1;(a[i]==0 || a[i]==2);i--); pp=i+1; } x.pop_back(); } if(x.size()>1) for(auto xx:x) {if(xx%2==0) w=-3;} if(w==-3) cout << "0\n"; else if(w==0) { k=(((((2*n*n)%m)*((f[4*n-3]*pv[2*n-2])%m))%m)*(2*n-1))%m; cout << k << '\n'; //cout << (((256223893LL*fv[4*n-3])%m)*p[2*n-2])%m << '\n'; continue; } else{ //for(auto xx:x) //cout << xx <<' '; //cout << '\n'; //cout << pp << "PP\n"; if(x.size()==1) { //cout << ((f[4*n-2]*pv[2*n-1])%m) << '\n'; //cout << ((n*(2*n-1))%m) << '\n'; k=(f[4*n-2]*pv[2*n-1])%m; k*=(n*(2*n-1))%m; k%=m; cout << k << "\n"; continue;} if((pp%2 and w==1) or (pp%2==0 and w==-1)) { cout << 0 <<"\n"; continue;} k1=0; k2=0; k3=0; k4=0; xs=x.size()/2; for(auto xx: x) { if(xx<0){ xp=-xx/2; ax=((f[4*n-2*xs-2]*pv[2*n-2*xs-1])%m); ax*=((xp*xs)%m); k1+=ax%m; //xp*xs*f[4*n-2*xs-2]*pv[2*n-2*xs-1]; k1%=m; if(n>xs) { ax=(f[4*n-2*xs-2]*pv[2*n-2*xs-2])%m; ax*=(n-xs+(m-((xp+1)*pv[1])%m))%m; ax%=m; k1+=(xp*ax)%m; //xp*(n-xs-(xp+1)*pv[2])*f[4*n-2*xs-2]*pv[2*n-2*xs-2]; k1%=m; } if(n>xs) { ax=(f[4*n-2*xs-3]*pv[2*n-2*xs-1])%m; ax*=(xp*(xp+1))%m; ax%=m; k2+=((xs+1)*ax); //(xs+1)*xp*(xp+1)*f[4*n-2*xs-3]*pv[2*n-2*xs]; k2%=m; } if(n>xs+1){ ax=(f[4*n-2*xs-3]*pv[2*n-2*xs-2])%m; ax*=(xp*(xp+1))%m; ax%=m; k2+=(n-xs-1)*ax; //(n-xs-1)*xp*(xp+1)*f[4*n-xs-3]*pv[2*n-2*xs-1]; k2%=m; } } else { xp=xx/2; ax=(f[4*n-2*xs-1]*pv[2*n-2*xs])%m; k3+=xs*ax; //xs*f[4*n-2*xs-1]*pv[2*n-2*xs]; k3%=m; if(n>xs){ ax=(f[4*n-2*xs-1]*pv[2*n-2*xs-1])%m; k3+=(n-xp-xs)*ax; //(n-xp-xs)*f[4*n-2*xs-1]*pv[2*n-2*xs-1]; k3%=m; } if(n>xs){ ax=(f[4*n-2*xs-2]*pv[2*n-2*xs-1])%m; ax*=((xs+1)*xp)%m; ax%=m; k4+=ax; //(xs+1)*xp*f[4*n-2*xs-2]*pv[2*n-2*xs-1]; k4%=m; } if(n>xs+1){ ax=(f[4*n-2*xs-2]*pv[2*n-2*xs-2])%m; ax*=((n-xs-1)*xp)%m; ax%=m; k4+=ax;//(n-xs-1)*xp*f[4*n-xs-2]*pv[2*n-2*xs-2]; k4%=m; } } } //cout << k1 << ' '<< k2 << ' ' << k3 << ' ' << k4 << '\n'; cout << (k1+k2+k3+k4)%m << '\n'; //if((k1+k2+k3+k4)%m==126000) { //for(j=0;j<2*n;j++) cout << a[j] << ' '; //cout << '\n'; //return 0; //} } } } |
English