1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#include <bits/stdc++.h>
#ifndef ONLINE_JUDGE
# pragma GCC diagnostic warning "-Wall"
# pragma GCC diagnostic warning "-Wextra"
# pragma GCC diagnostic warning "-Wformat=2"
# pragma GCC diagnostic warning "-Wnull-dereference"
# pragma GCC diagnostic warning "-Wduplicated-branches"
# pragma GCC diagnostic warning "-Wduplicated-cond"
# pragma GCC diagnostic warning "-Wfloat-equal"
# pragma GCC diagnostic warning "-Wshadow"
# pragma GCC diagnostic warning "-Wconversion"
# pragma GCC diagnostic warning "-Wlogical-op"
# pragma GCC diagnostic warning "-Wvector-operation-performance"
# pragma GCC diagnostic warning "-Wdisabled-optimization"
# pragma GCC diagnostic warning "-Wunsafe-loop-optimizations"
# pragma GCC diagnostic warning "-Wdouble-promotion"
#endif
#pragma GCC target "arch=ivybridge", "tune=ivybridge"
#if defined(ONLINE_JUDGE) || !defined(__OPTIMIZE__)
# pragma GCC optimize "Ofast", "inline", "unroll-loops", "ipa-pta", "no-rtti", \
  "no-exceptions", "nothrow-opt", "strict-enums", "stdarg-opt", "tracer"
# pragma GCC target "inline-all-stringops"
#endif
#define rangeof(c) (c).begin(), (c).end()

using namespace std;
using uint = unsigned int;
using ll = long long;
using ull = unsigned long long;
using ld = long double;

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);

  int const mod = 1000000007;
  
  int n;
  cin >> n;
  vector<ll> nums(n);
  vector<ll> pref_sum(n + 1, 0);
  bool is_sum_over_mod = false;
  for(int i = 0; i < n; i++) {
    cin >> nums[i];
    pref_sum[i + 1] = (pref_sum[i] + nums[i]) % mod;
    is_sum_over_mod |= pref_sum[i] + nums[i] >= mod;
  }
  
  auto num_sum = [&](int a, int b) -> ll {
    return (pref_sum[b + 1] - pref_sum[a] + mod) % mod;
  };
  
  if(n <= 3000 || is_sum_over_mod) {
    vector<vector<ll>> dp(n, vector<ll>(n, 0));
    dp[0][0] = 1;
    for(int i = 1; i < n; i++) {
      // dodajemy do istniejacego albo robimy nowy
      for(int j = 0; j < i; j++) {
        dp[i][j] = dp[i - 1][j];
        if(j <= i - 1 && num_sum(j, i - 1) % 2 == 0) {
          dp[i][i] += dp[i - 1][j];
          dp[i][i] %= mod;
        }
      }
    }
    
    ll result = 0;
    for(int i = 0; i < n; i++) {
      if(num_sum(i, n - 1) % 2 != 0) continue;
      result = (result + dp[n - 1][i]) % mod;
    }
    cout << result << "\n";
    
  } else { // assuming the sum of all numbers doesn't ever exceed 10^9+7
    if(is_sum_over_mod) {
      cout << "NIE\n";
      return 0;
    }
    int const m = 2;
    vector<array<array<ll, 2>, 2>> dp(n + 1);
    dp[0][0][0] = 1;
    for(int i = 1; i <= n; i++) {
      for(int prev = 0; prev < m; prev++) {
        // dodajemy do istniejacego albo robimy nowy dla nums[i - 1]
        for(int curr = 0; curr < m; curr++) {
          dp[n][prev][curr] = dp[n][prev][(curr - nums[i - 1] % m + m) % m];
        }
        dp[n][prev][nums[i - 1] % m] += dp[n][prev][prev];
        dp[n][prev][nums[i - 1] % m] %= mod;
      }
    }
    cout << dp[n][0][0] << "\n";
  }
}