#include #include #include #include #include #include #include using namespace std; ifstream inF("duel.in"); ofstream outF("duel.out"); #define cin inF #define cout outF const int MAX_N = 305; typedef unsigned long long ull; typedef long long sll; const sll MOD = 1e9 + 7; sll n; sll p[MAX_N]; sll ans; void input() { cin >> n; for (int i = 0; i < n; ++i) { cin >> p[i]; p[i] *= 2; } } void output() { cout << ans << "\n"; } const sll MAX_SCORE = 3 * MAX_N * MAX_N; sll dp[MAX_N + 1][MAX_SCORE]; sll totalScore[MAX_N + 1]; void solve() { totalScore[0] = 0; for (int i = 0; i < n; ++i) { totalScore[i + 1] = totalScore[i] + p[i]; } dp[0][0] = 1; for (int i = 1; i < n; ++i) { double maxScore = totalScore[n] / 2; double minScore = std::max(0.0, totalScore[i] - maxScore); double prevMinScore = std::max(0.0, totalScore[i - 1] - maxScore); //std::cerr << i << " -- " << maxScore << " " << minScore << " " << prevMinScore << ": " << std::endl; for (int j = minScore + 0.75; j <= maxScore; ++j) { dp[i][j] = 0; if (j - p[i - 1] >= prevMinScore) dp[i][j] += dp[i - 1][j - p[i - 1]]; if (j - p[i - 1] / 2 >= prevMinScore) dp[i][j] += dp[i - 1][j - p[i - 1] / 2]; if (j >= prevMinScore) dp[i][j] += dp[i - 1][j]; dp[i][j] %= MOD; } } double maxScore = totalScore[n] / 2; double minScore = std::max(0.0, totalScore[n - 1] - maxScore); ans = 0; for (int j = minScore + 0.75; j <= maxScore; ++j) { if (j + p[n - 1] != maxScore) ans += dp[n - 1][j]; if (j + p[n - 1] / 2 != maxScore) ans += dp[n - 1][j]; if (j != maxScore) ans += dp[n - 1][j]; ans %= MOD; } } int main() { std::ios::sync_with_stdio(false); cin.tie(nullptr); /*int t; cin >> t; for (int i = 0; i < t; ++i)*/ { input(); solve(); output(); } return 0; }