#include #include const int N = 10; int n, a[N], s[N], ans; template void read(T& x) { x = 0; char c = getchar(); int f = 1; while (!isdigit(c)) { if (c == '-') f = -1; c = getchar(); } while (isdigit(c)) { x = x * 10 + (c - '0'); c = getchar(); } x *= f; } void dfs(int x, int y) { // 当前得分已经大于最终得分 if (s[x] > a[x]) return; // 如果以后的比赛全赢也小于最后的分数 if (s[x] + (n - y + 1) * 3 < a[x]) return; if (x == n && s[x] == a[x]) { ans++; return; } if (y == n) { int t = a[x] - s[x]; // 最后一场比赛无法凑出 2 分 switch (t) { case 0: { s[y] += 3; dfs(x + 1, x + 2); s[y] -= 3; break; } case 1: { s[x] += 1; s[y] += 1; dfs(x + 1, x + 2); s[x] -= 1; s[y] -= 1; break; } case 3: { s[x] += 3; dfs(x + 1, x + 2); s[x] -= 3; break; } } return; } // x 胜 s[x] += 3; s[y] += 0; dfs(x, y + 1); s[x] -= 3; s[y] -= 0; // 平局 s[x] += 1; s[y] += 1; dfs(x, y + 1); s[x] -= 1; s[y] -= 1; // y 胜 s[x] += 0; s[y] += 3; dfs(x, y + 1); s[x] -= 0; s[y] -= 3; } int main() { read(n); for (int i = 1; i <= n; i++) { read(a[i]); } dfs(1, 2); printf("%d\n", ans); return 0; }