#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
typedef long long unsigned int ll;
/*
4
1000000006 1 5 1000000004
3
1000000006 1 5
2
2 2
3
6 1 5
3
2 2 2
*/
constexpr int MOD = 1000000007;
bool is_mopa_number(ll num)
{
return !((num%MOD)&1);
}
int n;
vector<int> a;
ll solve_exp(int pos=0)
{
ll result=0;
ll sum=0;
while(pos<n)
{
sum+=a[pos++];
if(!((sum%MOD)&1))
{
result+=(pos==n?1:solve_exp(pos));
result=result%MOD;
}
}
return result;
}
int main()
{
cin>>n;
a.resize(n);
ll sum=0;
for(int i=0;i<n;++i)
{
cin>>a[i];
sum+=a[i];
}
if(sum<MOD) //O(n)
{
ll res[2];
res[0]=(a[0]&1)?0:1;
res[1]=1-res[0];
for(int i=1;i<n;++i)
{
ll new_res[2];
if(a[i]&1)
{
new_res[0]=res[1]*2;
new_res[1]=res[0];
}
else
{
new_res[0]=res[0]*2;
new_res[1]=res[1];
}
res[0]=new_res[0]%MOD;
res[1]=new_res[1]%MOD;
}
cout<<res[0];
}
else
{
cout<<solve_exp();
}
#if 0
else
{
unordered_map<ll,ll> ms[2];
ms[0][a[0]]=(a[0]&1)?0:1;
for(int i=1;i<n;++i)
{
const ll num=a[i];
const auto& prev_m=ms[1-(i&1)];
auto& curr_m=ms[i&1];
curr_m.clear();
for(const auto& p : prev_m)
{
const ll new_num=(p.first+num)%MOD;
const bool is_new_num_mopa=!(new_num&1);
if(is_new_num_mopa&&is_mopa_number(p.first)==is_mopa_number(num))
curr_m[new_num]=(p.second*2)%MOD;
else
curr_m[new_num]=p.second;
}
}
ll result=0;
auto& result_m=ms[1-(n&1)];
for(const auto& p : result_m)
if(is_mopa_number(p.first))
result+=p.second%MOD;
cout<<result;
}
#endif
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 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 | #include <iostream> #include <vector> #include <unordered_map> using namespace std; typedef long long unsigned int ll; /* 4 1000000006 1 5 1000000004 3 1000000006 1 5 2 2 2 3 6 1 5 3 2 2 2 */ constexpr int MOD = 1000000007; bool is_mopa_number(ll num) { return !((num%MOD)&1); } int n; vector<int> a; ll solve_exp(int pos=0) { ll result=0; ll sum=0; while(pos<n) { sum+=a[pos++]; if(!((sum%MOD)&1)) { result+=(pos==n?1:solve_exp(pos)); result=result%MOD; } } return result; } int main() { cin>>n; a.resize(n); ll sum=0; for(int i=0;i<n;++i) { cin>>a[i]; sum+=a[i]; } if(sum<MOD) //O(n) { ll res[2]; res[0]=(a[0]&1)?0:1; res[1]=1-res[0]; for(int i=1;i<n;++i) { ll new_res[2]; if(a[i]&1) { new_res[0]=res[1]*2; new_res[1]=res[0]; } else { new_res[0]=res[0]*2; new_res[1]=res[1]; } res[0]=new_res[0]%MOD; res[1]=new_res[1]%MOD; } cout<<res[0]; } else { cout<<solve_exp(); } #if 0 else { unordered_map<ll,ll> ms[2]; ms[0][a[0]]=(a[0]&1)?0:1; for(int i=1;i<n;++i) { const ll num=a[i]; const auto& prev_m=ms[1-(i&1)]; auto& curr_m=ms[i&1]; curr_m.clear(); for(const auto& p : prev_m) { const ll new_num=(p.first+num)%MOD; const bool is_new_num_mopa=!(new_num&1); if(is_new_num_mopa&&is_mopa_number(p.first)==is_mopa_number(num)) curr_m[new_num]=(p.second*2)%MOD; else curr_m[new_num]=p.second; } } ll result=0; auto& result_m=ms[1-(n&1)]; for(const auto& p : result_m) if(is_mopa_number(p.first)) result+=p.second%MOD; cout<<result; } #endif return 0; } |
English