Submission

Status:

(PPPPPPPPPP)(PPPPP)(PPPPP)(PPPPPPPPPP)

Subtask/Task Score:

{20/20}{30/30}{30/30}{20/20}

Score: 100

User: tHeNyXs

Problemset: กองไฟ

Language: cpp

Time: 0.017 second

Submitted On: 2026-03-05 20:08:51

#include <bits/stdc++.h>
using namespace std;

#define ll long long
ll dp[51][51][51][4][4];
const int MOD = 1e9+7;

int main() {
    ios_base::sync_with_stdio(false); cin.tie(nullptr);
    int n; cin >> n;
    int A, B, C;
    cin >> A >> B >> C;
    int start[] = {1, 2, 3};
    ll ans = 0;
    for (int first : start) {
        if (first == 1 && A == 0) continue;
        if (first == 2 && B == 0) continue;
        if (first == 3 && C == 0) continue;
        int a = A, b = B, c = C;
        memset(dp, 0, sizeof(dp));
        if (first == 1) a--;
        if (first == 2) b--;
        if (first == 3) c--;
        dp[a][b][c][first][first] = 1;
        
        for (int i = a; i >= 0; --i) {
            for (int j = b; j >= 0; --j) {
                for (int k = c; k >= 0; --k) {
                    for (int last : start) {
                        for (int f : start) {
                            ll prev = dp[i][j][k][last][f];
                            if (prev == 0) continue;

                            if (last != 1 && i > 0) dp[i-1][j][k][1][f] = (dp[i-1][j][k][1][f] + prev) % MOD;
                            if (last != 2 && j > 0) dp[i][j-1][k][2][f] = (dp[i][j-1][k][2][f] + prev) % MOD;
                            if (last != 3 && k > 0) dp[i][j][k-1][3][f] = (dp[i][j][k-1][3][f] + prev) % MOD;
                        }
                    }
                }
            }
        }

        for (int last : start) {
            if (last != first) ans = (ans + dp[0][0][0][last][first]) % MOD;
        }
    }
    cout << ans;

    return 0;
}