#include "bits/stdc++.h"
using namespace std;
const long long MAX_VAL = 1000000007;
long long silnia(long long base) {
if(base == 0) {
return 1;
}
long long result = base;
base--;
while(base > 1) {
result *= base;
result %= MAX_VAL;
}
return result;
}
long long pow2(long long up) {
long long result = 1;
while(up > 0) {
result<<1;
result %= MAX_VAL;
up--;
}
return result;
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t;
cin >> t;
for(int i=0; i<t; i++) {
int n;
cin>>n;
vector<int> points;
points.resize(n*2);
map<int, int> points_map;
for(int j=0; j<n*2; j++) {
cin>>points[j];
points_map[points[j]]++;
}
if(points_map[0] != 0 && points_map[2] != 0) {
cout<<0<<"\n";
continue;
}
int result = 0;
if(points_map[0] == n*2 || points_map[2] == n*2) {
long long q = silnia(n*4 - 2) / pow2(n*2-1);
long long first = (n * q) % MAX_VAL;
long long w = silnia(n*4 - 4) / pow2(n*2-2);
long long second = n*(n-1);
second %= MAX_VAL;
second *= n*4 - 2;
second %= MAX_VAL;
second *= n*4 - 3;
second %= MAX_VAL;
second *= w;
second %= MAX_VAL;
result = (first + second) % MAX_VAL;
}
cout<<result<<"\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 | #include "bits/stdc++.h" using namespace std; const long long MAX_VAL = 1000000007; long long silnia(long long base) { if(base == 0) { return 1; } long long result = base; base--; while(base > 1) { result *= base; result %= MAX_VAL; } return result; } long long pow2(long long up) { long long result = 1; while(up > 0) { result<<1; result %= MAX_VAL; up--; } return result; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int t; cin >> t; for(int i=0; i<t; i++) { int n; cin>>n; vector<int> points; points.resize(n*2); map<int, int> points_map; for(int j=0; j<n*2; j++) { cin>>points[j]; points_map[points[j]]++; } if(points_map[0] != 0 && points_map[2] != 0) { cout<<0<<"\n"; continue; } int result = 0; if(points_map[0] == n*2 || points_map[2] == n*2) { long long q = silnia(n*4 - 2) / pow2(n*2-1); long long first = (n * q) % MAX_VAL; long long w = silnia(n*4 - 4) / pow2(n*2-2); long long second = n*(n-1); second %= MAX_VAL; second *= n*4 - 2; second %= MAX_VAL; second *= n*4 - 3; second %= MAX_VAL; second *= w; second %= MAX_VAL; result = (first + second) % MAX_VAL; } cout<<result<<"\n"; } return 0; } |
English