Submission

Status:

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

Subtask/Task Score:

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

Score: 100

User: 12345678

Problemset: กองไฟ

Language: cpp

Time: 0.007 second

Submitted On: 2025-11-27 21:35:14

#include <bits/stdc++.h>

using namespace std;

const int nx=155, kx=51, mod=1e9+7;

int n, a, b, c, dp[nx][kx][kx][3][3], ans;

int main()
{
    cin.tie(NULL)->sync_with_stdio(false);
    cin>>n>>a>>b>>c;
    if (a) dp[1][1][0][0][0]=1;
    if (b) dp[1][0][1][1][1]=1;
    if (c) 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+j<=i; k++)
            {
                int ca=j, cb=k, cc=i-j-k;
                if (cc>c) 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) ans=(ans+dp[n][a][b][i][j])%mod;
    cout<<ans;
}