#include <bits/stdc++.h>
using namespace std;
#define ull uint64_t
#define MODULO 1000000007
ull PowMod(ull n) {
// https://stackoverflow.com/a/24967040
ull ret = 1;
ull a = 2;
while (n > 0) {
if (n & 1)
ret = ret * a % MODULO;
a = a * a % MODULO;
n >>= 1;
}
return ret;
}
int main() {
// freopen("pan0.in", "r", stdin);
ios_base::sync_with_stdio(0);
cin.tie(0);
int mod = 1000000007;
int n;
cin >> n;
int64_t total = 0;
int even_count = 0;
vector<int> tab(n);
for (auto& a : tab) {
cin >> a;
total += a;
if (total % 2 == 0)
even_count++;
}
if (total < mod) {
// code for a_i <= 100, so range-sums are below modulo and parity never switches
int res = 0;
if (total % 2 == 0) {
res = PowMod(even_count - 1);
}
cout << res << endl;
return 0;
}
// simple n**2 approach, possible starting point for something better
vector<int> dp(n + 1);
dp[0] = 1;
for (int c = 1; c < dp.size(); c++) {
int x = 0;
int64_t sm = 0;//tab[c-1];
for (int p = c - 1; p >= 0; p--) {
sm += tab[p];
if ((sm % mod) % 2 == 0) {
x = (x + dp[p]) % mod;
}
}
dp[c] = x;
}
cout << dp.back() << endl;
}
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 | #include <bits/stdc++.h> using namespace std; #define ull uint64_t #define MODULO 1000000007 ull PowMod(ull n) { // https://stackoverflow.com/a/24967040 ull ret = 1; ull a = 2; while (n > 0) { if (n & 1) ret = ret * a % MODULO; a = a * a % MODULO; n >>= 1; } return ret; } int main() { // freopen("pan0.in", "r", stdin); ios_base::sync_with_stdio(0); cin.tie(0); int mod = 1000000007; int n; cin >> n; int64_t total = 0; int even_count = 0; vector<int> tab(n); for (auto& a : tab) { cin >> a; total += a; if (total % 2 == 0) even_count++; } if (total < mod) { // code for a_i <= 100, so range-sums are below modulo and parity never switches int res = 0; if (total % 2 == 0) { res = PowMod(even_count - 1); } cout << res << endl; return 0; } // simple n**2 approach, possible starting point for something better vector<int> dp(n + 1); dp[0] = 1; for (int c = 1; c < dp.size(); c++) { int x = 0; int64_t sm = 0;//tab[c-1]; for (int p = c - 1; p >= 0; p--) { sm += tab[p]; if ((sm % mod) % 2 == 0) { x = (x + dp[p]) % mod; } } dp[c] = x; } cout << dp.back() << endl; } |
English