#include <iostream>
#include <vector>
namespace {
using std::cin;
using std::cout;
using value_t = size_t;
using number_t = size_t;
using value_seq_t = std::vector<value_t>;
using number_seq_t = std::vector<number_t>;
inline value_t const PRIME = 1000000007;
value_t add_mod(value_t x, value_t y) {
value_t res = x + y;
return res >= PRIME ? res - PRIME : res;
}
bool check_evenness(value_seq_t const & v,
number_t beg, number_t end) {
value_t sum = 0;
for (size_t k = beg; k <= end; ++k) {
sum = add_mod(sum, v[k]);
}
return sum % 2 == 0;
}
void count_mop_intervals(value_seq_t const & v,
number_t beg,
number_seq_t & c) {
if (beg == v.size() - 1) {
if (v[beg] % 2 == 0)
c.push_back(1);
else
c.push_back(0);
} else {
number_t counter = 0;
number_t n = v.size() - beg;
count_mop_intervals(v, beg + 1, c);
for (size_t k = 0; k < n - 1; ++k) {
if (check_evenness(v, 0, beg + k))
counter = add_mod(counter, c[n - k - 2]);
}
if (check_evenness(v, beg, v.size() - 1))
counter = add_mod(counter, 1);
c.push_back(counter);
}
}
}
int main() {
number_t n;
value_t v;
value_seq_t values;
number_seq_t counters;
cin >> n;
for (size_t k = 0; k < n; ++k) {
cin >> v;
values.push_back(v);
}
count_mop_intervals(values, 0, counters);
cout << add_mod(counters.back(), 0);
return 0;
}
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 | #include <iostream> #include <vector> namespace { using std::cin; using std::cout; using value_t = size_t; using number_t = size_t; using value_seq_t = std::vector<value_t>; using number_seq_t = std::vector<number_t>; inline value_t const PRIME = 1000000007; value_t add_mod(value_t x, value_t y) { value_t res = x + y; return res >= PRIME ? res - PRIME : res; } bool check_evenness(value_seq_t const & v, number_t beg, number_t end) { value_t sum = 0; for (size_t k = beg; k <= end; ++k) { sum = add_mod(sum, v[k]); } return sum % 2 == 0; } void count_mop_intervals(value_seq_t const & v, number_t beg, number_seq_t & c) { if (beg == v.size() - 1) { if (v[beg] % 2 == 0) c.push_back(1); else c.push_back(0); } else { number_t counter = 0; number_t n = v.size() - beg; count_mop_intervals(v, beg + 1, c); for (size_t k = 0; k < n - 1; ++k) { if (check_evenness(v, 0, beg + k)) counter = add_mod(counter, c[n - k - 2]); } if (check_evenness(v, beg, v.size() - 1)) counter = add_mod(counter, 1); c.push_back(counter); } } } int main() { number_t n; value_t v; value_seq_t values; number_seq_t counters; cin >> n; for (size_t k = 0; k < n; ++k) { cin >> v; values.push_back(v); } count_mop_intervals(values, 0, counters); cout << add_mod(counters.back(), 0); return 0; } |
English