#include <cstdio>
#include <cstdlib>
#include <cstdint>
#include <vector>
#include <map>
#include <algorithm>
#include <set>
#include <time.h>
#include <queue>
using namespace std;
const int64_t P = 1000000007;
int main () {
int n;
scanf("%d", &n);
vector<int64_t> xs;
for (int i = 0; i < n; ++i) {
int64_t x;
scanf("%lld", &x);
xs.push_back(x);
}
if (n <= 5000) {
vector<int64_t> ok;
for (int i = 0; i < n; ++i) {
int64_t cnt = 0;
int64_t sum = 0;
for (int j = i; j >= 0; --j) {
sum = (sum + xs[j]) % P;
if (sum % 2 == 0) {
cnt = (cnt + (j > 0 ? ok[j - 1] : 1)) % P;
}
}
ok.push_back(cnt);
}
printf("%lld\n", ok[n - 1]);
return 0;
}
int64_t end0 = 1;
int64_t end1 = 0;
for (int i = 0; i < n; ++i) {
if (xs[i] % 2) {
int64_t old_end0 = end0;
end0 = end1;
end1 = (end1 + old_end0) % P;
}
else {
end0 = (end0 * 2) % P;
}
}
printf("%lld\n", end0);
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 | #include <cstdio> #include <cstdlib> #include <cstdint> #include <vector> #include <map> #include <algorithm> #include <set> #include <time.h> #include <queue> using namespace std; const int64_t P = 1000000007; int main () { int n; scanf("%d", &n); vector<int64_t> xs; for (int i = 0; i < n; ++i) { int64_t x; scanf("%lld", &x); xs.push_back(x); } if (n <= 5000) { vector<int64_t> ok; for (int i = 0; i < n; ++i) { int64_t cnt = 0; int64_t sum = 0; for (int j = i; j >= 0; --j) { sum = (sum + xs[j]) % P; if (sum % 2 == 0) { cnt = (cnt + (j > 0 ? ok[j - 1] : 1)) % P; } } ok.push_back(cnt); } printf("%lld\n", ok[n - 1]); return 0; } int64_t end0 = 1; int64_t end1 = 0; for (int i = 0; i < n; ++i) { if (xs[i] % 2) { int64_t old_end0 = end0; end0 = end1; end1 = (end1 + old_end0) % P; } else { end0 = (end0 * 2) % P; } } printf("%lld\n", end0); return 0; } |
English