//runda 3B
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int n;
long long a, wynik = 0LL, pierwsza = 1000000007LL;
vector<long> wejscie;
void Przedzialy(int start, int end, int ilosc) {
long long sumaP = 0LL, sumaK = 0LL;
if(end - start + 1 < ilosc)
return;
if(ilosc == 1) {
for(int i = start; i <= end; ++i) {
sumaK += wejscie[i];
sumaK = sumaK % pierwsza;
}
if(!(sumaK % 2)) {
++wynik;
wynik = wynik % pierwsza;
}
//cout << start << " - " << end << " - " << ilosc << endl;
return;
}
if(ilosc == 2) {
for(int i = start; i <= end; ++i) {
sumaK += wejscie[i];
sumaK = sumaK % pierwsza;
}
for(int i = start; i < end; ++i) {
sumaP += wejscie[i];
sumaP = sumaP % pierwsza;
sumaK += pierwsza;
sumaK -= wejscie[i];
sumaK = sumaK % pierwsza;
if(!(sumaK % 2) && !(sumaP % 2)) {
++wynik;
wynik = wynik % pierwsza;
}
// cout << start << " - " << i << " # " << i + 1 << " - " << end << " # " << ilosc << endl;
}
return;
}
//cout << start <<"tu" << endl;
for(int i = start; i <= end - ilosc + 1; ++i) {
//cout << i << " - " << end - (start + ilosc - i) - 1 << " - " << ilosc << endl;
sumaP += wejscie[i];
sumaP = sumaP % pierwsza;
sumaK = 0LL;
for(int j = end; j >= i + ilosc - 1; --j) {
//cout << start << " - " << i << " # " << j << " - " << end << " # " << ilosc << endl;
sumaK += wejscie[j];
sumaK = sumaK % pierwsza;
if(!(sumaK % 2) && !(sumaP % 2))
Przedzialy(i + 1, j - 1, ilosc - 2);
}
}
}
int main() {
ios_base::sync_with_stdio(0);
cin >> n;
for(int iN = 0; iN < n; ++iN) {
cin >> a;
wejscie.push_back(a);
}
for(int iP = 1; iP <= n; ++iP)
Przedzialy(0, n - 1 , iP);
//Przedzialy(0, n - 1 , 200);
cout << wynik;
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 | //runda 3B #include <iostream> #include <vector> #include <algorithm> using namespace std; int n; long long a, wynik = 0LL, pierwsza = 1000000007LL; vector<long> wejscie; void Przedzialy(int start, int end, int ilosc) { long long sumaP = 0LL, sumaK = 0LL; if(end - start + 1 < ilosc) return; if(ilosc == 1) { for(int i = start; i <= end; ++i) { sumaK += wejscie[i]; sumaK = sumaK % pierwsza; } if(!(sumaK % 2)) { ++wynik; wynik = wynik % pierwsza; } //cout << start << " - " << end << " - " << ilosc << endl; return; } if(ilosc == 2) { for(int i = start; i <= end; ++i) { sumaK += wejscie[i]; sumaK = sumaK % pierwsza; } for(int i = start; i < end; ++i) { sumaP += wejscie[i]; sumaP = sumaP % pierwsza; sumaK += pierwsza; sumaK -= wejscie[i]; sumaK = sumaK % pierwsza; if(!(sumaK % 2) && !(sumaP % 2)) { ++wynik; wynik = wynik % pierwsza; } // cout << start << " - " << i << " # " << i + 1 << " - " << end << " # " << ilosc << endl; } return; } //cout << start <<"tu" << endl; for(int i = start; i <= end - ilosc + 1; ++i) { //cout << i << " - " << end - (start + ilosc - i) - 1 << " - " << ilosc << endl; sumaP += wejscie[i]; sumaP = sumaP % pierwsza; sumaK = 0LL; for(int j = end; j >= i + ilosc - 1; --j) { //cout << start << " - " << i << " # " << j << " - " << end << " # " << ilosc << endl; sumaK += wejscie[j]; sumaK = sumaK % pierwsza; if(!(sumaK % 2) && !(sumaP % 2)) Przedzialy(i + 1, j - 1, ilosc - 2); } } } int main() { ios_base::sync_with_stdio(0); cin >> n; for(int iN = 0; iN < n; ++iN) { cin >> a; wejscie.push_back(a); } for(int iP = 1; iP <= n; ++iP) Przedzialy(0, n - 1 , iP); //Przedzialy(0, n - 1 , 200); cout << wynik; return 0; } |
English