#include <vector>
#include <iostream>
#include <algorithm>
#include <string>
#include <map>
using namespace std;
const int MOD = 1000000007;
int n;
vector<int> liczby;
void wczytaj() {
ios_base::sync_with_stdio(false);
cin >> n;
liczby.resize(n);
for (int i = 0; i < n; i++) {
cin >> liczby[i];
}
}
long long duze() {
vector<long long> nCiagi;
nCiagi.resize(n + 1);
for (int i = n-1; i >= 0; i--) {
long long suma = 0;
long long nCiag = 0;
for (int j = i; j < n; j++) {
suma = (suma + liczby[j]) % MOD;
if (suma % 2 == 0) {
if (j == n - 1) { nCiag = (nCiag + 1) % MOD; }
else {
nCiag = (nCiag + nCiagi[j + 1]) % MOD;
}
}
// cerr << i << ", " << j << ", " << suma << ", " << nCiag << endl;
}
// cerr << nCiag << " ";
nCiagi[i] = nCiag;
}
return nCiagi[0];
}
long long male() {
long long wynik = 0;
int nieparzyste = 0;
bool bylo = false;
for (int liczba : liczby) {
if (liczba % 2 == 1) {
if ((++nieparzyste % 2) == 1) {
bylo = false;
} else {
bylo = true;
wynik = wynik == 0 ? 1 : (wynik + wynik) % MOD;
}
} else {
if (bylo) {
wynik = (wynik + wynik) % MOD;
} else if (nieparzyste == 0) {
wynik = 1;
bylo = true;
}
}
// cerr << wynik * bylo << " ";
}
return wynik * bylo;
}
int main() {
wczytaj();
long long suma = 0;
for (int liczba : liczby) {
if ((suma += liczba) >= MOD) break;
}
if (suma >= MOD) {
cout << duze();
} else {
cout << male();
}
return 0;
}
int main2() {
wczytaj();
for (int& liczba : liczby) {
liczba = liczba % 100 + 1;
}
auto m = male();
auto d = duze();
if (m != d) {
cout << m << ' ' << d;
}
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 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 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 | #include <vector> #include <iostream> #include <algorithm> #include <string> #include <map> using namespace std; const int MOD = 1000000007; int n; vector<int> liczby; void wczytaj() { ios_base::sync_with_stdio(false); cin >> n; liczby.resize(n); for (int i = 0; i < n; i++) { cin >> liczby[i]; } } long long duze() { vector<long long> nCiagi; nCiagi.resize(n + 1); for (int i = n-1; i >= 0; i--) { long long suma = 0; long long nCiag = 0; for (int j = i; j < n; j++) { suma = (suma + liczby[j]) % MOD; if (suma % 2 == 0) { if (j == n - 1) { nCiag = (nCiag + 1) % MOD; } else { nCiag = (nCiag + nCiagi[j + 1]) % MOD; } } // cerr << i << ", " << j << ", " << suma << ", " << nCiag << endl; } // cerr << nCiag << " "; nCiagi[i] = nCiag; } return nCiagi[0]; } long long male() { long long wynik = 0; int nieparzyste = 0; bool bylo = false; for (int liczba : liczby) { if (liczba % 2 == 1) { if ((++nieparzyste % 2) == 1) { bylo = false; } else { bylo = true; wynik = wynik == 0 ? 1 : (wynik + wynik) % MOD; } } else { if (bylo) { wynik = (wynik + wynik) % MOD; } else if (nieparzyste == 0) { wynik = 1; bylo = true; } } // cerr << wynik * bylo << " "; } return wynik * bylo; } int main() { wczytaj(); long long suma = 0; for (int liczba : liczby) { if ((suma += liczba) >= MOD) break; } if (suma >= MOD) { cout << duze(); } else { cout << male(); } return 0; } int main2() { wczytaj(); for (int& liczba : liczby) { liczba = liczba % 100 + 1; } auto m = male(); auto d = duze(); if (m != d) { cout << m << ' ' << d; } return 0; } |
English