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;
}