#include <bits/stdc++.h>
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2")
//#define int long long
#define pii pair<int,int>
#define vi vector<int>
#define ff first
#define ss second
#define sp << " " <<
#define all(x) x.begin(),x.end()
#define big(x) ((int)(x.size()))
using namespace std;
const int MOD = 1e9+7, LIM = 1e6+1, inf = 2e18;
const int N = 1e5+1;
int add(int x,int y) {
if ((x + y) >= MOD) return x + y - MOD;
return x + y;
}
int mult(int x,int y) {
return (1LL * x * y) % MOD;
}
int n,t;
int dp[201][201][201];
void solve() {
vi A(2*n+1),B(2*n+1),C(2*n+1);
for (int i=1;i<=2*n;i++) cin >> A[i];
for (int i=1;i<=2*n;i++) cin >> B[i];
for (int i=1;i<=2*n;i++) cin >> C[i];
int ctra = 0,ctrb = 0,ctrc = 0,comunab = 0;
for (int i=1;i<=2*n;i++) {
int fl = 1,fl2 = 1,fl3 = 1;
for (int j = 1;j<=2*n;j++) {
if (j == i) continue;
if (A[i] == A[j]) fl = 0;
if (B[i] == B[j]) fl2 = 0;
if (C[i] == C[j]) fl3 = 0;
}
ctra+=fl;
ctrb+=fl2;
ctrc+=fl3;
for (int j = 1;j<=2*n;j++) {
if (A[i] == B[j]) comunab++;
}
}
vector<pair<pii,int>> states;
for (int s = 6*n;s >= 0;s-=2) {
for (int a = 0;a<=2*n;a++) {
for (int b = 0;b <= 2*n && a+b <= s;b++) {
if (2*(a+b)-s < 0) continue;
int j = (2*(a+b)-s)/2;
if (j <= a && j <= b) {
states.push_back({{a,b},j});
dp[a][b][j] = 0;
}
}
}
}
dp[ctra][ctrb][comunab] = 1;
for (auto it : states) {
int a = it.ff.ff,b = it.ff.ss,cab = it.ss;
int c = (b-cab)+(a-cab);
int cac = a-cab;
int cbc = b-cab;
int mydp = dp[a][b][cab];
if (!mydp) continue;
for (int i = 1;i<8;i++) {
vi coms{cab,cbc,cac};
vi curs{a,b,c};
int howto = 1;
for (int j = 0;j<3;j++) {
int nxt = (j+1)%3;
int prv = (j+2)%3;
if (i&(1<<j)) {
howto = mult(howto,coms[j]);
if (!howto) break;
curs[j]--;
curs[nxt]--;
coms[j]--;
}
else {
if (!curs[j]) {
continue;
}
howto = mult(howto,curs[j]-coms[j]);
if (!howto) break;
curs[j]--;
curs[nxt]++;
coms[prv]--;
coms[nxt]++;
}
}
if (!howto) continue;
dp[curs[0]][curs[1]][coms[0]] = add(dp[curs[0]][curs[1]][coms[0]],mult(mydp,howto));
}
}
cout << dp[0][0][0]<< '\n';
}
signed main() {
ios_base::sync_with_stdio(0); cin.tie(0);
cin >> n >> t;
while (t --> 0) solve();
}
Compilation message (stderr)
fishing.cpp:13:43: warning: overflow in conversion from 'double' to 'int' changes value from '2.0e+18' to '2147483647' [-Woverflow]
13 | const int MOD = 1e9+7, LIM = 1e6+1, inf = 2e18;
| ^~~~| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |