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.244 second
Submitted On: 2026-03-06 16:54:33
#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));
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;
cout<<ans;
return 0;
}
/*
7
3 3 1
*/