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