#include <bits/stdc++.h>
using namespace std;
long long e=1000*1000*1000+7;
long long pref[300*1000+6];
long long f[300*1000+5];
long long sym_v2(int n){
//cout << "czek"<<endl;
bool parz=1;
long long wynik=-1;
for (int i=0; i<n;i++){
if ((pref[i+1]-pref[i])%2){
parz=!parz;
if (parz){
wynik*=2;
if (wynik==-2){
wynik=1;
}
wynik%=e;
}
}
else if (parz){
wynik*=2;
if (wynik==-2){
wynik=1;
}
}
//cout << (pref[i+1]-pref[i])%2<<" "<<parz<<" "<<wynik<<" "<<endl;
}
//cout << parz<<endl;
if (!parz){
return 0;
}else{
return wynik;
}
}
long long czyprzedzial_mop( int j, int i){
long long tmp = pref[i+1] - pref[j];
if (tmp<0){
tmp+=e;
}
return (tmp%e);
}
int main(){
int n;
cin >> n;
pref[0]=0;
bool czek = 1;
for (int i=0;i<n;i++){
long long l=0;
cin >> l;
pref[i+1]=(pref[i]+l)%e;
f[i]=0;
if (l>100){
czek=0;
}
}
if (czek){
cout << sym_v2(n)%e<<endl;
}else{
for (int i=0;i<n;i++){
for (int j=0;j<i;j++){
f[i]+=f[j]*(long long)(czyprzedzial_mop(j+1,i)%2==0);
f[i]%=e;
//cout <<f[j]<<" "<<j+1<<" "<<i<<" "<<czyprzedzial_mop(pref,j+1,i)<<";"<<endl;
}
f[i]+=(long long)(czyprzedzial_mop(0,i)%2==0);
f[i]%=e;
//cout << i<<" "<<f[i]<<endl;
}
cout<<f[n-1]%e<<endl;
}
}
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 | #include <bits/stdc++.h> using namespace std; long long e=1000*1000*1000+7; long long pref[300*1000+6]; long long f[300*1000+5]; long long sym_v2(int n){ //cout << "czek"<<endl; bool parz=1; long long wynik=-1; for (int i=0; i<n;i++){ if ((pref[i+1]-pref[i])%2){ parz=!parz; if (parz){ wynik*=2; if (wynik==-2){ wynik=1; } wynik%=e; } } else if (parz){ wynik*=2; if (wynik==-2){ wynik=1; } } //cout << (pref[i+1]-pref[i])%2<<" "<<parz<<" "<<wynik<<" "<<endl; } //cout << parz<<endl; if (!parz){ return 0; }else{ return wynik; } } long long czyprzedzial_mop( int j, int i){ long long tmp = pref[i+1] - pref[j]; if (tmp<0){ tmp+=e; } return (tmp%e); } int main(){ int n; cin >> n; pref[0]=0; bool czek = 1; for (int i=0;i<n;i++){ long long l=0; cin >> l; pref[i+1]=(pref[i]+l)%e; f[i]=0; if (l>100){ czek=0; } } if (czek){ cout << sym_v2(n)%e<<endl; }else{ for (int i=0;i<n;i++){ for (int j=0;j<i;j++){ f[i]+=f[j]*(long long)(czyprzedzial_mop(j+1,i)%2==0); f[i]%=e; //cout <<f[j]<<" "<<j+1<<" "<<i<<" "<<czyprzedzial_mop(pref,j+1,i)<<";"<<endl; } f[i]+=(long long)(czyprzedzial_mop(0,i)%2==0); f[i]%=e; //cout << i<<" "<<f[i]<<endl; } cout<<f[n-1]%e<<endl; } } |
English