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