Submission

Status:

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

Subtask/Task Score:

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

Score: 100

User: Gump2011

Problemset: กองไฟ

Language: cpp

Time: 0.011 second

Submitted On: 2026-03-08 22:33:47

#include <bits/stdc++.h>
using namespace std;

const long long MOD = 1000000007;

int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);

    int N,a,b,c;
    cin >> N;
    cin >> a >> b >> c;

    long long ans = 0;

    for(int start=0;start<3;start++){
        if(start==0 && a==0) continue;
        if(start==1 && b==0) continue;
        if(start==2 && c==0) continue;

        static long long dp[155][55][55][3];
        memset(dp,0,sizeof(dp));

        int A=0,B=0,C=0;

        if(start==0) A=1;
        if(start==1) B=1;
        if(start==2) C=1;

        dp[1][A][B][start]=1;

        for(int i=1;i<N;i++){
            for(int x=0;x<=a;x++){
                for(int y=0;y<=b;y++){
                    for(int last=0;last<3;last++){
                        long long cur=dp[i][x][y][last];
                        if(cur==0) continue;

                        int z=i-x-y;

                        for(int t=0;t<3;t++){
                            if(t==last) continue;

                            int nx=x,ny=y,nz=z;

                            if(t==0) nx++;
                            if(t==1) ny++;
                            if(t==2) nz++;

                            if(nx>a||ny>b||nz>c) continue;

                            dp[i+1][nx][ny][t]=(dp[i+1][nx][ny][t]+cur)%MOD;
                        }
                    }
                }
            }
        }

        for(int last=0;last<3;last++){
            if(last==start) continue;
            ans=(ans+dp[N][a][b][last])%MOD;
        }
    }

    cout<<ans;
}