Submission

Status:

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

Subtask/Task Score:

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

Score: 100

User: august

Problemset: กองไฟ

Language: cpp

Time: 0.005 second

Submitted On: 2026-03-10 19:38:23

#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[51][51][51][3], dp1[51][51][51][3], dp2[51][51][51][3];

void sm1() {
    

    if (a==0) return;
    dp[1][0][0][0] = 1;
    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[ca][cb][cc][0] = (dp[ca][cb][cc][0] + dp[ca-1][cb][cc][1])%MOD;
                        dp[ca][cb][cc][0] = (dp[ca][cb][cc][0] + dp[ca-1][cb][cc][2])%MOD;
                    }
                    else if (pick==1 && cb-1 >=0) {
                        dp[ca][cb][cc][1] = (dp[ca][cb][cc][1] + dp[ca][cb-1][cc][0])%MOD;
                        dp[ca][cb][cc][1] = (dp[ca][cb][cc][1] + dp[ca][cb-1][cc][2])%MOD;
                    }
                    else if (pick==2 && cc-1>=0) {
                        dp[ca][cb][cc][2] = (dp[ca][cb][cc][2] + dp[ca][cb][cc-1][0])%MOD;
                        dp[ca][cb][cc][2] = (dp[ca][cb][cc][2] + dp[ca][cb][cc-1][1])%MOD;
                    }
                    //cout<< i<< ' '<< ca<< ' '<< cb<< ' '<< cc<< ' '<< pick<< ' '<< dp[ca][cb][cc][pick]<< '\n';
                }
            }
        }
    }
    ans = (dp[a][b][c][2] + dp[a][b][c][1])%MOD;
}

void sm2() {

    if (b==0) return;
    dp1[0][1][0][1] = 1;
    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 && ca-1 >=0) {
                        dp1[ca][cb][cc][0] = (dp1[ca][cb][cc][0] + dp1[ca-1][cb][cc][1])%MOD;
                        dp1[ca][cb][cc][0] = (dp1[ca][cb][cc][0] + dp1[ca-1][cb][cc][2])%MOD;
                    }
                    else if (pick==1) {
                        dp1[ca][cb][cc][1] = (dp1[ca][cb][cc][1] + dp1[ca][cb-1][cc][0])%MOD;
                        dp1[ca][cb][cc][1] = (dp1[ca][cb][cc][1] + dp1[ca][cb-1][cc][2])%MOD;
                    }
                    else if (pick==2 && cc-1>=0) {
                        dp1[ca][cb][cc][2] = (dp1[ca][cb][cc][2] + dp1[ca][cb][cc-1][0])%MOD;
                        dp1[ca][cb][cc][2] = (dp1[ca][cb][cc][2] + dp1[ca][cb][cc-1][1])%MOD;
                    }
                    //cout<< i<< ' '<< ca<< ' '<< cb<< ' '<< cc<< ' '<< pick<< ' '<< dp1[ca][cb][cc][pick]<< '\n';
                }
            }
        }
    }
    ans = (ans+(dp1[a][b][c][0] + dp1[a][b][c][2])%MOD)%MOD;
}

void sm3() {

    if (c==0) return;
    dp2[0][0][1][2] = 1;
    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 && ca-1>=0) {
                        dp2[ca][cb][cc][0] = (dp2[ca][cb][cc][0] + dp2[ca-1][cb][cc][1])%MOD;
                        dp2[ca][cb][cc][0] = (dp2[ca][cb][cc][0] + dp2[ca-1][cb][cc][2])%MOD;
                    }
                    else if (pick==1 && cb-1>=0) {
                        dp2[ca][cb][cc][1] = (dp2[ca][cb][cc][1] + dp2[ca][cb-1][cc][0])%MOD;
                        dp2[ca][cb][cc][1] = (dp2[ca][cb][cc][1] + dp2[ca][cb-1][cc][2])%MOD;
                    }
                    else if (pick==2) {
                        dp2[ca][cb][cc][2] = (dp2[ca][cb][cc][2] + dp2[ca][cb][cc-1][0])%MOD;
                        dp2[ca][cb][cc][2] = (dp2[ca][cb][cc][2] + dp2[ca][cb][cc-1][1])%MOD;
                    }
                    //cout<< i<< ' '<< ca<< ' '<< cb<< ' '<< cc<< ' '<< pick<< ' '<< dp2[i][ca][cb][cc][pick]<< '\n';
                }
            }
        }
    }
    ans = (ans+(dp2[a][b][c][0] + dp2[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;
}