Submission

Status:

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

Subtask/Task Score:

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

Score: 80

User: devilpoohs

Problemset: กองไฟ

Language: cpp

Time: 0.248 second

Submitted On: 2026-03-06 16:56:18

#include<bits/stdc++.h>
using namespace std;
vector<string> v;
const int mod=1e9+7;
int n;
int fnt=0;
// int dp[160][55][55][55][3];
int think(int i,int a,int b,int c,int tpe,vector<vector<vector<vector<vector<int>>>>>& dp){
    if(i==0){
        return 1;
    }
    if(dp[i][a][b][c][tpe]!=-1) return dp[i][a][b][c][tpe]; 
    int cnt=0;
    if(i==1){
        if(tpe==0 and a>0){
            if(fnt!=0){
                cnt+=think(i-1,a-1,b,c,0,dp);
                cnt%=mod;
            }
        }
        if(tpe==1 and b>0){
            if(fnt!=1){
                cnt+=think(i-1,a,b-1,c,1,dp);
                cnt%=mod;
            }
        }
        if(tpe==2 and c>0){
            if(fnt!=2){
                cnt+=think(i-1,a,b,c-1,2,dp);
                cnt%=mod;
            }
        }
    }else{
        if(tpe==0 and a>0){
            cnt+=think(i-1,a-1,b,c,1,dp);
            cnt%=mod;
            cnt+=think(i-1,a-1,b,c,2,dp);
            cnt%=mod;
        }else if(tpe==1 and b>0){
            cnt+=think(i-1,a,b-1,c,0,dp);
            cnt%=mod;
            cnt+=think(i-1,a,b-1,c,2,dp);
            cnt%=mod;
        }else if(tpe==2 and c>0){
            cnt+=think(i-1,a,b,c-1,1,dp);
            cnt%=mod;
            cnt+=think(i-1,a,b,c-1,0,dp);
            cnt%=mod;
        }   
    }
    // return cnt;
    return dp[i][a][b][c][tpe]=cnt;
}

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    // memset(dp,-1,sizeof(dp));
    int a,b,c;
    cin>>n>>a>>b>>c;
    vector<vector<vector<vector<vector<int>>>>> dp (n+1,vector<vector<vector<vector<int>>>>(a+1,vector<vector<vector<int>>> (b+1,vector<vector<int>> (c+1,vector<int>(3,-1)))));
    int ans=think(n,a,b,c,0,dp)%mod;
    // memset(dp,-1,sizeof(dp));
    fnt=1;
    for(int i=0;i<=n;i++)
    for(int j=0;j<=a;j++)
    for(int k=0;k<=b;k++)
    for(int r=0;r<=c;r++)
    for(int t=0;t<=2;t++)
    dp[i][j][k][r][t]=-1;

    ans+=think(n,a,b,c,1,dp)%mod;
    // memset(dp,-1,sizeof(dp));
    ans%=mod;
    for(int i=0;i<=n;i++)
    for(int j=0;j<=a;j++)
    for(int k=0;k<=b;k++)
    for(int r=0;r<=c;r++)
    for(int t=0;t<=2;t++)
    dp[i][j][k][r][t]=-1;
    fnt=2;
    ans+=think(n,a,b,c,2,dp)%mod;
    ans%=mod;
    cout<<ans;
    return 0;
}
/*
7
3 3 1
*/