Submission

Status:

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

Subtask/Task Score:

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

Score: 100

User: KantaponZ

Problemset: กองไฟ

Language: cpp

Time: 0.032 second

Submitted On: 2026-01-22 00:02:03

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

#define ll long long
int N, max_a, max_b, max_c;
ll dp[151][4][4][51][51];
ll MOD = 1e9 + 7;

ll solve(int idx, int first, int cur, int a, int b) {
    int c = idx - a - b;
   
    if (idx == N) {
        if (cur == first) return 0LL;
        return 1LL;
    }

    if (dp[idx][first][cur][a][b] != -1) {
        return dp[idx][first][cur][a][b];
    }

    ll ans = 0;
    for (int i = 1; i <= 3; i++) {
        if (cur == i) continue;
        if (i == 1) {
            if (a + 1 > max_a) continue;
            ans = (ans + solve(idx + 1, first, i, a + 1, b)) % MOD;
        } else if (i == 2) {
            if (b + 1 > max_b) continue;
            ans = (ans + solve(idx + 1, first, i, a, b + 1)) % MOD;
        } else {
            if (c + 1 > max_c) continue;
            ans = (ans + solve(idx + 1, first, i, a, b)) % MOD;
        }
    }

    dp[idx][first][cur][a][b] = ans;
    return ans;
}

int main() {
    ios_base::sync_with_stdio(0), cin.tie(0);
    cin >> N >> max_a >> max_b >> max_c;
    memset(dp, -1, sizeof dp);
    ll ans = 0;
    for (int i = 1; i <= 3; i++) {
        if (i == 1 && max_a != 0) ans = (ans + solve(1, i, i, 1, 0)) % MOD;
        if (i == 2 && max_b != 0) ans = (ans + solve(1, i, i, 0, 1)) % MOD;
        if (i == 3 && max_c != 0) ans = (ans + solve(1, i, i, 0, 0)) % MOD;
    }
    cout << ans;
}