Submission

Status:

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

Subtask/Task Score:

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

Score: 100

User: erng

Problemset: กองไฟ

Language: cpp

Time: 0.012 second

Submitted On: 2026-03-11 22:30:29

#include <bits/stdc++.h>

using namespace std;

#define ll long long

ll n, a, b, c, dp[155][55][55][3][3], ans, mod=1e9+7;

int main()
{
    cin.tie(NULL)->sync_with_stdio(false);
    cin>>n>>a>>b>>c;
    if (a) dp[1][1][0][0][0]=1;
    dp[1][0][1][1][1]=1;
    dp[1][0][0][2][2]=1;
    for (int i=2; i<=n; i++)
    {
        for (int j=0; j<=a; j++)
        {
            for (int k=0; k<=b; k++)
            {
                int ca=j, cb=k, cc=i-j-k;
                if (cc>c || cc<0) continue;
                for (int cur=0; cur<3; cur++)
                {
                    for (int f=0; f<3; f++)
                    {
                        if (cur==0)
                        {
                            if (!ca) continue;
                            for (int pv=0; pv<3; pv++)
                            {
                                if (pv!=cur) dp[i][ca][cb][cur][f]=(dp[i][ca][cb][cur][f]+dp[i-1][ca-1][cb][pv][f])%mod;
                            }
                        }
                        if (cur==1)
                        {
                            if (!cb) continue;
                            for (int pv=0; pv<3; pv++)
                            {
                                if (pv!=cur) dp[i][ca][cb][cur][f]=(dp[i][ca][cb][cur][f]+dp[i-1][ca][cb-1][pv][f])%mod;
                            }
                        }
                        if (cur==2)
                        {
                            if (!cc) continue;
                            for (int pv=0; pv<3; pv++)
                            {
                                if (pv!=cur) dp[i][ca][cb][cur][f]=(dp[i][ca][cb][cur][f]+dp[i-1][ca][cb][pv][f])%mod;
                            }
                        }
                    }
                }
            }
        }
    }
    for (int i=0; i<3; i++)
    {
        for (int j=0; j<3; j++)
        {
            if (i==j) continue;
            ans=(ans+dp[n][a][b][i][j])%mod;
        }
    }
    cout<<ans;
}