제출 #1297471

#제출 시각아이디문제언어결과실행 시간메모리
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();
}

컴파일 시 표준 에러 (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...