#include <iostream> #include <stdint.h> #include <vector> #include <algorithm> using namespace std; uint32_t D = 1'000'000'007; uint64_t power(uint64_t a, uint32_t b, uint64_t p) {// calculate a^b mod p uint64_t wynik =1; a=a%p; while (b>0) { if(b%2) wynik = (wynik*a) %p; b = b>>1; //b=b/2 a = (a*a) %p; } return wynik; } int main() { uint32_t n; cin>>n; vector<int64_t> ciag(n); for(uint32_t ii=0; ii<n; ii++) cin>>ciag[ii]; vector<int64_t> cumsum(n+1); copy(ciag.begin(), ciag.end(), cumsum.begin()+1); for(uint32_t ii=1; ii<cumsum.size(); ii++) cumsum[ii]+=cumsum[ii-1]; // podzadanie z malymi liczbami w ciagu if(cumsum.back()<D) { if(cumsum.back()%2==1) //nieparzysta suma wszystkich elementow - brak rozwiazan { cout<<0<<endl; return 0; } uint32_t licznik=0; bool redukcja=false; // redukcja podciagow zaczynajacych sie i konczacych liczba nieparzysta do 1 liczby parzystej for(uint32_t ii=0; ii<n; ii++) { if(ciag[ii]%2==0 && redukcja==false) licznik++; else if(ciag[ii]%2==1 && redukcja==false) redukcja = true; else if(ciag[ii]%2==1 && redukcja==true) { redukcja=false; licznik++; } } cout<<power(2, licznik-1, D)<<endl; return 0; } // wlasciwe zadanie - rozw kwadrarowe vector<int64_t> ileDotadRozw(n+1,0); ileDotadRozw[0]=1; // rozwiazanie do zerowego elementu - rozwiazanie od 0 do k zawsze jest 1 for(uint32_t ii=1; ii<cumsum.size(); ii++) { for(uint32_t jj=0; jj<ii; jj++) { if(((cumsum[ii] - cumsum[jj]) %D) %2==0) { ileDotadRozw[ii] = (ileDotadRozw[ii] + ileDotadRozw[jj]) %D; } } } cout<< ileDotadRozw.back()<<endl; 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 | #include <iostream> #include <stdint.h> #include <vector> #include <algorithm> using namespace std; uint32_t D = 1'000'000'007; uint64_t power(uint64_t a, uint32_t b, uint64_t p) {// calculate a^b mod p uint64_t wynik =1; a=a%p; while (b>0) { if(b%2) wynik = (wynik*a) %p; b = b>>1; //b=b/2 a = (a*a) %p; } return wynik; } int main() { uint32_t n; cin>>n; vector<int64_t> ciag(n); for(uint32_t ii=0; ii<n; ii++) cin>>ciag[ii]; vector<int64_t> cumsum(n+1); copy(ciag.begin(), ciag.end(), cumsum.begin()+1); for(uint32_t ii=1; ii<cumsum.size(); ii++) cumsum[ii]+=cumsum[ii-1]; // podzadanie z malymi liczbami w ciagu if(cumsum.back()<D) { if(cumsum.back()%2==1) //nieparzysta suma wszystkich elementow - brak rozwiazan { cout<<0<<endl; return 0; } uint32_t licznik=0; bool redukcja=false; // redukcja podciagow zaczynajacych sie i konczacych liczba nieparzysta do 1 liczby parzystej for(uint32_t ii=0; ii<n; ii++) { if(ciag[ii]%2==0 && redukcja==false) licznik++; else if(ciag[ii]%2==1 && redukcja==false) redukcja = true; else if(ciag[ii]%2==1 && redukcja==true) { redukcja=false; licznik++; } } cout<<power(2, licznik-1, D)<<endl; return 0; } // wlasciwe zadanie - rozw kwadrarowe vector<int64_t> ileDotadRozw(n+1,0); ileDotadRozw[0]=1; // rozwiazanie do zerowego elementu - rozwiazanie od 0 do k zawsze jest 1 for(uint32_t ii=1; ii<cumsum.size(); ii++) { for(uint32_t jj=0; jj<ii; jj++) { if(((cumsum[ii] - cumsum[jj]) %D) %2==0) { ileDotadRozw[ii] = (ileDotadRozw[ii] + ileDotadRozw[jj]) %D; } } } cout<< ileDotadRozw.back()<<endl; return 0; } |