Submission
Status:
(xSSSSSSSSS)(xSSSS)(xSSSS)(SSSSSSSSSS)
Subtask/Task Score:
{0/20}{0/30}{0/30}{0/20}
Score: 0
User: theem1502
Problemset: กองไฟ
Language: cpp
Time: 0.001 second
Submitted On: 2026-02-22 12:23:22
#include <bits/stdc++.h>
using namespace std;
int num;
int dp[151][51][51][51][3][3];
vector<int> check(3);
const int mod = 1e9 + 7;
int recursion(int currentx,vector<int> &check, int forbidden, int first, vector<int> &realcheck) {
// int currentx = realcheck[0] - check[0] + realcheck[1] + realcheck[2] - check[1] - check[2];
// cout << "curr " << currentx << " " << forbidden << "\n";
int sum = 0;
if (currentx == num) {
// cout << "no";
return 1;
}
if (currentx == num -1) {
for (int i = 0; i < 3; i ++) {
if (i == first || i == forbidden || check[i] <= 0) {
continue;
}
check[i]--;
sum += recursion(currentx+1,check, i, first, realcheck) % mod;
check[i]++;
}
return sum % mod;
}
if (dp[currentx][check[0]][check[1]][check[2]][forbidden][first] != -1) {
return dp[currentx][check[0]][check[1]][check[2]][forbidden][first] % mod;
}
/*
if (forbidden == 1) {
sum += recursion();
}
if (forbidden == 2) {
sum += recursion() + recursion();a
}
if (forbidden == 3) {
sum += recursion() + recursion();
}
*/
if (currentx == 0) {
// cout << "yes";
for (int i = 0; i < 3; i++) {
if (forbidden == i || check[i] <= 0) {
continue;
}
check[i]--;
sum += recursion(currentx+1,check, i, i, realcheck) % mod;
check[i]++;
}
return dp[currentx][check[0]][check[1]][check[2]][forbidden][first] = sum % mod;
}
for (int i = 0; i < 3; i++) {
if (forbidden == i || check[i] <= 0) {
continue;
}
check[i]--;
sum += recursion(currentx+1,check, i, first, realcheck);
check[i]++;
}
return dp[currentx][check[0]][check[1]][check[2]][forbidden][first] = sum % mod;
}
int main() {
memset(dp, -1, sizeof(dp));
cin >> num >> check[0] >> check[1] >> check[2];
vector<int> another = check;
cout << recursion(0,check, -1,-1, another) % mod;
}