Submission
Status:
(PPPPPPPPPP)(PPPPP)(PPPPP)(PPPP-SSSSS)
Subtask/Task Score:
{20/20}{30/30}{30/30}{0/20}
Score: 80
User: foldnut
Problemset: กองไฟ
Language: cpp
Time: 0.114 second
Submitted On: 2025-12-01 19:27:45
#include <bits/stdc++.h>
using namespace std;
const int MD = 1e9 + 7;
int n, A, B, C, ans, dp[2][55][55][55][4];
void clean(int x){
for(int a = 0;a<=A;a++){
for(int b = 0;b<=B;b++){
for(int c = 0;c<=C;c++){
dp[x][a][b][c][0] = dp[x][a][b][c][1] = dp[x][a][b][c][2] = dp[x][a][b][c][3] = 0;
}
}
}
}
signed main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> n >> A >> B >> C;
if(A != 0){
dp[1][0][1][0][2] = 1;
dp[1][0][0][1][3] = 1;
for(int i = 2;i<=n - 1;i++){
clean(i%2);
for(int a = 0;a<=A - 1;a++){
for(int b = 0;b<=B;b++){
for(int c = 0;c<=C;c++){
if(a - 1 >= 0){
dp[i%2][a][b][c][1] = (dp[(i - 1) % 2][a - 1][b][c][0] + dp[(i - 1) % 2][a - 1][b][c][2] + dp[(i - 1) % 2][a - 1][b][c][3]) % MD;
}
if(b - 1 >= 0){
dp[i%2][a][b][c][2] = (dp[(i - 1) % 2][a][b - 1][c][0] + dp[(i - 1) % 2][a][b - 1][c][1] + dp[(i - 1) % 2][a][b - 1][c][3]) % MD;
}
if(c - 1 >= 0){
dp[i%2][a][b][c][3] = (dp[(i - 1) % 2][a][b][c - 1][0] + dp[(i - 1) % 2][a][b][c - 1][1] + dp[(i - 1) % 2][a][b][c - 1][2]) % MD;
}
}
}
}
}
ans += (dp[(n - 1) % 2][A - 1][B][C][0] + dp[(n - 1) % 2][A - 1][B][C][2] + dp[(n - 1) % 2][A - 1][B][C][3]) % MD;
memset(dp, 0, sizeof dp);
}
if(B != 0){
dp[1][1][0][0][1] = 1;
dp[1][0][0][1][3] = 1;
for(int i = 2;i<=n - 1;i++){
clean(i%2);
for(int a = 0;a<=A;a++){
for(int b = 0;b<=B - 1;b++){
for(int c = 0;c<=C;c++){
if(a - 1 >= 0){
dp[i%2][a][b][c][1] = (dp[(i - 1) % 2][a - 1][b][c][0] + dp[(i - 1) % 2][a - 1][b][c][2] + dp[(i - 1) % 2][a - 1][b][c][3]) % MD;
}
if(b - 1 >= 0){
dp[i%2][a][b][c][2] = (dp[(i - 1) % 2][a][b - 1][c][0] + dp[(i - 1) % 2][a][b - 1][c][1] + dp[(i - 1) % 2][a][b - 1][c][3]) % MD;
}
if(c - 1 >= 0){
dp[i%2][a][b][c][3] = (dp[(i - 1) % 2][a][b][c - 1][0] + dp[(i - 1) % 2][a][b][c - 1][1] + dp[(i - 1) % 2][a][b][c - 1][2]) % MD;
}
}
}
}
}
ans += (dp[(n - 1) % 2][A][B - 1][C][0] + dp[(n - 1) % 2][A][B - 1][C][1] + dp[(n - 1) % 2][A][B - 1][C][3]) % MD;
memset(dp, 0, sizeof dp);
}
if(C != 0){
dp[1][1][0][0][1] = 1;
dp[1][0][1][0][2] = 1;
for(int i = 2;i<=n - 1;i++){
clean(i%2);
for(int a = 0;a<=A;a++){
for(int b = 0;b<=B;b++){
for(int c = 0;c<=C - 1;c++){
if(a - 1 >= 0){
dp[i%2][a][b][c][1] = (dp[(i - 1) % 2][a - 1][b][c][0] + dp[(i - 1) % 2][a - 1][b][c][2] + dp[(i - 1) % 2][a - 1][b][c][3]) % MD;
}
if(b - 1 >= 0){
dp[i%2][a][b][c][2] = (dp[(i - 1) % 2][a][b - 1][c][0] + dp[(i - 1) % 2][a][b - 1][c][1] + dp[(i - 1) % 2][a][b - 1][c][3]) % MD;
}
if(c - 1 >= 0){
dp[i%2][a][b][c][3] = (dp[(i - 1) % 2][a][b][c - 1][0] + dp[(i - 1) % 2][a][b][c - 1][1] + dp[(i - 1) % 2][a][b][c - 1][2]) % MD;
}
}
}
}
}
ans += (dp[(n - 1) % 2][A][B][C - 1][0] + dp[(n - 1) % 2][A][B][C - 1][1] + dp[(n - 1) % 2][A][B][C - 1][2]) % MD;
}
cout << ans;
}