#include <iostream> #include <map> #include <vector> using namespace std; const int64_t MOD=1000000000+7; inline int add(int a, int b) { return (int)((a+b)%MOD); } inline int sub(int a, int b) { return (int)((a+(MOD-b))%MOD); } inline int mul(int64_t a, int64_t b) { return (int)((a*b)%MOD); } inline bool isValid(int v) { return (v&1)==0; } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); // wczytanie wejścia /** Liczba elementów (liczb) */ int n; cin>>n; /** Dane wejściowe */ int* data=new int[n]; for(int i=0;i<n;++i) cin>>data[i]; // if(n>3000) { // cout<<0<<endl; // return 0; // } /** Sumy podciągów danej ilości elementów modulo liczba z zadania */ int* sum=new int[n+1]; /** Liczba poprawnych ciągów o danej długości, które spełniają wymagania */ int* valid=new int[n+1]; { int64_t s=0; sum[0]=0; valid[0]=1; // ciąg długości 0 jest poprawny na potrzeby kalkulacji for(int i=0;i<n;++i) { // Aktualizujemy tablicę sum o nowy element const int cSum=sum[i+1]=(int)((s+=data[i])%MOD); int res=0; // Liczymy ile jest podciągów z daną liczbą spełniających wymagania for(int j=i;j>=0;--j) { const int vr=valid[j]; if(vr==0) continue; // jeżeli nie ma poprawnych podciągów przed danym zakresem, to pomijamy if(!isValid( sub(cSum, sum[j]) )) continue; res=add(res, vr); } valid[i+1]=res; } } cout<<valid[n]<<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 | #include <iostream> #include <map> #include <vector> using namespace std; const int64_t MOD=1000000000+7; inline int add(int a, int b) { return (int)((a+b)%MOD); } inline int sub(int a, int b) { return (int)((a+(MOD-b))%MOD); } inline int mul(int64_t a, int64_t b) { return (int)((a*b)%MOD); } inline bool isValid(int v) { return (v&1)==0; } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); // wczytanie wejścia /** Liczba elementów (liczb) */ int n; cin>>n; /** Dane wejściowe */ int* data=new int[n]; for(int i=0;i<n;++i) cin>>data[i]; // if(n>3000) { // cout<<0<<endl; // return 0; // } /** Sumy podciągów danej ilości elementów modulo liczba z zadania */ int* sum=new int[n+1]; /** Liczba poprawnych ciągów o danej długości, które spełniają wymagania */ int* valid=new int[n+1]; { int64_t s=0; sum[0]=0; valid[0]=1; // ciąg długości 0 jest poprawny na potrzeby kalkulacji for(int i=0;i<n;++i) { // Aktualizujemy tablicę sum o nowy element const int cSum=sum[i+1]=(int)((s+=data[i])%MOD); int res=0; // Liczymy ile jest podciągów z daną liczbą spełniających wymagania for(int j=i;j>=0;--j) { const int vr=valid[j]; if(vr==0) continue; // jeżeli nie ma poprawnych podciągów przed danym zakresem, to pomijamy if(!isValid( sub(cSum, sum[j]) )) continue; res=add(res, vr); } valid[i+1]=res; } } cout<<valid[n]<<endl; return 0; } |