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;
}