Submission #332073

#TimeUsernameProblemLanguageResultExecution timeMemory
332073alextodoranFishing Game (RMI19_fishing)C++17
80 / 100
2097 ms99188 KiB
/** ____ ____ ____ ____ ____ ||a |||t |||o |||d |||o || ||__|||__|||__|||__|||__|| |/__\|/__\|/__\|/__\|/__\| **/ #include <bits/stdc++.h> using namespace std; typedef long long ll; const int N_MAX = 102; const int MOD = 1e9+7; int n, t; int dp[3 * N_MAX][3 * N_MAX][3 * N_MAX]; bool a[3 * N_MAX], b[3 * N_MAX], c[3 * N_MAX]; int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> n >> t; dp[0][0][0] = 1; for(int s = 1; s <= 6 * n; s++) for(int i = 0; i <= 3 * n && i <= s; i++) for(int j = 0; j <= 3 * n && i + j <= s; j++) { int k = s - i - j; if(k > 3 * n) continue; ll sum = 0; int x1 = 1, y1 = 1, z1 = 1; if(i + k > 0) x1 = 2; if(j + i - 1 > 0) y1 = 2; if(k + j - 2 > 0) z1 = 2; for(int x = x1; x <= 3; x++) for(int y = y1; y <= 3; y++) for(int z = z1; z <= 3; z++) { int i1 = i, j1 = j, k1 = k; bool ok = false; int prod = 1; if(x == 1) { if(i1 + k1 > 0) continue; } else if(x == 2) { if(i1 == 0) continue; prod *= i1; i1--; ok = true; } else { if(k1 == 0) continue; prod *= k1; j1++; k1--; } if(y == 1) { if(j1 + i1 > 0) continue; } else if(y == 2) { if(j1 == 0) continue; prod *= j1; j1--; ok = true; } else { if(i1 == 0) continue; prod *= i1; k1++; i1--; } if(z == 1) { if(k1 + j1 > 0) continue; } else if(z == 2) { if(k1 == 0) continue; prod *= k1; k1--; ok = true; } else { if(j1 == 0) continue; prod *= j1; i1++; j1--; } if(ok == false) continue; sum += 1LL * dp[i1][j1][k1] * prod; } dp[i][j][k] = sum % MOD; } while(t--) { for(int i = 1; i <= n * 3; i++) a[i] = b[i] = c[i] = false; for(int i = 1; i <= n * 2; i++) { int card; cin >> card; a[card] = true; } for(int i = 1; i <= n * 2; i++) { int card; cin >> card; b[card] = true; } for(int i = 1; i <= n * 2; i++) { int card; cin >> card; c[card] = true; } int I = 0, J = 0, K = 0; for(int i = 1; i <= n * 3; i++) I += (a[i] && b[i]); for(int i = 1; i <= n * 3; i++) J += (b[i] && c[i]); for(int i = 1; i <= n * 3; i++) K += (c[i] && a[i]); cout << dp[I][J][K] << "\n"; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...