# **Đệ quy có nhớ**
## Enjoy cake
**O(6*n)**
```cpp=
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6 + 5;
const int M = 1e9 + 7;
long long n, ans;
long long f[N][2][3];
// void dp(int pos, int A, int B, int C) {
// if(pos == n+1){
// if(A%2 == 0&&B%3 ==0){
// ans++;
// }
// return;
// }
// dp(pos+1,A+1,B,C);
// dp(pos+1,A,B+1,C);
// dp(pos+1,A,B,C+1);
// }
ll cal(ll pos, ll A, ll B) {
// B1: Đặt trả về
if (pos == n + 1) {
if (A % 2 == 0 && B % 3 == 0) return 1;
return 0;
}
// B2: QHĐ:
if (f[pos][A][B] != -1) return f[pos][A][B];
// B3: Sinh những trạng thái tiếp theo
ll tmp = 0;
tmp += cal(pos + 1, (A + 1) % 2, B);
tmp += cal(pos + 1, A, (B + 1) % 3);
tmp += cal(pos + 1, A, B);
tmp %= M;
// B4: Lưu kết quả
f[pos][A][B] = tmp;
return tmp;
}
// O(3^n)
// O(n^4)
// O(n^3)
// O(6 * n)
int main(){
cin >> n;
memset(f, -1, sizeof(f));
cout << cal(1, 0, 0);
}
```
## Minh, Ngọc, Sam
**O(n*S^2/9)**
```cpp=
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll N=1e6+6, mod=1e9+7;
ll cnt, n;
void open(){
ios_base::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
// freopen(".INP", "r", stdin);
// freopen(".OUT", "w", stdout);
}
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ii pair<ll,ll>
#define fi first
#define se second
const int N = 100 + 1;
const int S = 20 * 100;
const ll M = 1e9 + 7;
ll n;
ll a[N], s[N], ans = 0;
ll f[N][S / 3 + 1][S / 3 + 1];
ll cal(ll pos, ll y, ll z) {
if (pos == n + 1) {
if (s[n] - y - z > y && y == z) return 1;
return 0;
}
if (f[pos][y][z] != -1) return f[pos][y][z];
ll tmp = 0;
tmp += cal(pos + 1, y, z);
if (y + a[pos] <= S / 3) tmp += cal(pos + 1, y + a[pos], z);
if (z + a[pos] <= S / 3) tmp += cal(pos + 1, y, z + a[pos]);
tmp %= M;
f[pos][y][z] = tmp;
return tmp;
}
// O(n * S^3 / 9)
void SOLVE() {
cin >> n;
for (int i=1; i<=n; i++) {
cin >> a[i];
s[i] = s[i - 1] + a[i];
}
memset(f, -1, sizeof(f));
cout << cal(1, 0, 0);
}
int main() {
freopen("BAI3.inp","r",stdin);
freopen("BAI3.out","w",stdout);
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int t = 1;
// cin >> t;
while(t--) SOLVE();
return 0;
}