#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; } |