Submission

Status:

(xSSSSSSSSS)(xSSSS)(xSSSS)(SSSSSSSSSS)

Subtask/Task Score:

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

Score: 0

User: august

Problemset: กองไฟ

Language: cpp

Time: 0.001 second

Submitted On: 2026-03-10 19:03:26

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

const int mx = 151, MOD = 1e9+7;




/*
// 0 1, 2
// 1 0, 2
// 2 0, 1
*/

int n,a,b,c;

int ans;

int dp[mx][51][51][51][3], dp1[mx][51][51][51][3], dp2[mx][51][51][51][3];

void sm1() {
    

    if (a==0) return;
    dp[1][1][0][0][0] = 1;
    for (int i=2; i<=n; i++) {
        for (int ca=1; ca<=a; ca++) {
            for (int cb=0; cb<=b; cb++) {
                for (int cc=0; cc<=c; cc++) {
                    for (int pick=0; pick<3; pick++) {
                        if (pick==0) {
                            dp[i][ca][cb][cc][0] = (dp[i][ca][cb][cc][0] + dp[i-1][ca-1][cb][cc][1])%MOD;
                            dp[i][ca][cb][cc][0] = (dp[i][ca][cb][cc][0] + dp[i-1][ca-1][cb][cc][2])%MOD;
                        }
                        else if (pick==1) {
                            dp[i][ca][cb][cc][1] = (dp[i][ca][cb][cc][1] + dp[i-1][ca][cb-1][cc][0])%MOD;
                            dp[i][ca][cb][cc][1] = (dp[i][ca][cb][cc][1] + dp[i-1][ca][cb-1][cc][2])%MOD;
                        }
                        else {
                            dp[i][ca][cb][cc][2] = (dp[i][ca][cb][cc][2] + dp[i-1][ca][cb][cc-1][0])%MOD;
                            dp[i][ca][cb][cc][2] = (dp[i][ca][cb][cc][2] + dp[i-1][ca][cb][cc-1][1])%MOD;
                        }
                       //cout<< i<< ' '<< ca<< ' '<< cb<< ' '<< cc<< ' '<< pick<< ' '<< dp[i][ca][cb][cc][pick]<< '\n';
                    }
                }
            }
        }
    }
    ans = (dp[n][a][b][c][2] + dp[n][a][b][c][1])%MOD;
}

void sm2() {

    if (b==0) return;
    dp1[1][0][1][0][1] = 1;
    for (int i=2; i<=n; i++) {
        for (int ca=0; ca<=a; ca++) {
            for (int cb=1; cb<=b; cb++) {
                for (int cc=0; cc<=c; cc++) {
                    for (int pick=0; pick<3; pick++) {
                        if (pick==0) {
                            dp1[i][ca][cb][cc][0] = (dp1[i][ca][cb][cc][0] + dp1[i-1][ca-1][cb][cc][1])%MOD;
                            dp1[i][ca][cb][cc][0] = (dp1[i][ca][cb][cc][0] + dp1[i-1][ca-1][cb][cc][2])%MOD;
                        }
                        else if (pick==1) {
                            dp1[i][ca][cb][cc][1] = (dp1[i][ca][cb][cc][1] + dp1[i-1][ca][cb-1][cc][0])%MOD;
                            dp1[i][ca][cb][cc][1] = (dp1[i][ca][cb][cc][1] + dp1[i-1][ca][cb-1][cc][2])%MOD;
                        }
                        else {
                            dp1[i][ca][cb][cc][2] = (dp1[i][ca][cb][cc][2] + dp1[i-1][ca][cb][cc-1][0])%MOD;
                            dp1[i][ca][cb][cc][2] = (dp1[i][ca][cb][cc][2] + dp1[i-1][ca][cb][cc-1][1])%MOD;
                        }
                       //cout<< i<< ' '<< ca<< ' '<< cb<< ' '<< cc<< ' '<< pick<< ' '<< dp1[i][ca][cb][cc][pick]<< '\n';
                    }
                }
            }
        }
    }
    ans = (ans+(dp1[n][a][b][c][0] + dp1[n][a][b][c][2])%MOD)%MOD;
}

void sm3() {

    if (c==0) return;
    dp2[1][0][0][1][2] = 1;
    for (int i=2; i<=n; i++) {
        for (int ca=0; ca<=a; ca++) {
            for (int cb=0; cb<=b; cb++) {
                for (int cc=1; cc<=c; cc++) {
                    for (int pick=0; pick<3; pick++) {
                        if (pick==0) {
                            dp2[i][ca][cb][cc][0] = (dp2[i][ca][cb][cc][0] + dp2[i-1][ca-1][cb][cc][1])%MOD;
                            dp2[i][ca][cb][cc][0] = (dp2[i][ca][cb][cc][0] + dp2[i-1][ca-1][cb][cc][2])%MOD;
                        }
                        else if (pick==1) {
                            dp2[i][ca][cb][cc][1] = (dp2[i][ca][cb][cc][1] + dp2[i-1][ca][cb-1][cc][0])%MOD;
                            dp2[i][ca][cb][cc][1] = (dp2[i][ca][cb][cc][1] + dp2[i-1][ca][cb-1][cc][2])%MOD;
                        }
                        else {
                            dp2[i][ca][cb][cc][2] = (dp2[i][ca][cb][cc][2] + dp2[i-1][ca][cb][cc-1][0])%MOD;
                            dp2[i][ca][cb][cc][2] = (dp2[i][ca][cb][cc][2] + dp2[i-1][ca][cb][cc-1][1])%MOD;
                        }
                       //cout<< i<< ' '<< ca<< ' '<< cb<< ' '<< cc<< ' '<< pick<< ' '<< dp2[i][ca][cb][cc][pick]<< '\n';
                    }
                }
            }
        }
    }
    ans = (ans+(dp2[n][a][b][c][0] + dp2[n][a][b][c][1])%MOD)%MOD;

}

int32_t main() {
    cin.tie(0)->sync_with_stdio(0);

    cin>> n>> a>> b>> c;

    sm1();
    sm2();
    sm3();
    cout<< ans;
}