Submission

Status:

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

Subtask/Task Score:

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

Score: 100

User: mydKN

Problemset: กองไฟ

Language: cpp

Time: 0.397 second

Submitted On: 2026-03-09 18:46:05

#include <bits/stdc++.h>

using namespace std;

#define ll long long

const ll mod = 1e9 + 7;
const ll maxa = 55;

int n;
ll dp[2][3][3][maxa][maxa][maxa];
int arr[3];
ll res;

int main(){
	ios_base::sync_with_stdio(0);cin.tie(0);
	cin >> n;
	cin >> arr[0] >> arr[1] >> arr[2];
	dp[1][0][0][1][0][0] = dp[1][1][1][0][1][0] = dp[1][2][2][0][0][1] = 1;
	for(int i=2;i<=n;++i){
		memset(dp[i%2], 0, sizeof(dp[i%2]));
		for(int j=0;j<3;++j){
			for(int k=0;k<3;++k){
				for(int l=0;l<3;++l){
					if(k == l) continue;
					if(i == n && j == k) continue;
					for(int a=(k==0);a<=arr[0];++a){
						for(int b=(k==1);b<=arr[1];++b){
							for(int c=(k==2);c<=arr[2];++c){
								if(k==0) dp[i%2][j][k][a][b][c] = (dp[i%2][j][k][a][b][c] + dp[!(i%2)][j][l][a-1][b][c]) % mod;
								else if(k==1) dp[i%2][j][k][a][b][c] = (dp[i%2][j][k][a][b][c] + dp[!(i%2)][j][l][a][b-1][c]) % mod;
								else dp[i%2][j][k][a][b][c] = (dp[i%2][j][k][a][b][c] + dp[!(i%2)][j][l][a][b][c-1]) % mod;
							}
						}
					}
				}
			}
		}
	}
	for(int i=0;i<3;++i){
		for(int j=0;j<3;++j){
			res = (res + dp[n%2][i][j][arr[0]][arr[1]][arr[2]]) % mod;
		}
	}
	cout << res;
}