Submission #1297471

#TimeUsernameProblemLanguageResultExecution timeMemory
1297471dostsFishing Game (RMI19_fishing)C++20
100 / 100
1045 ms105744 KiB
#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 timeMemoryGrader output
Fetching results...