#include <cstdio>
#include <vector>
using namespace std;
#define FOR(i,a,b) for(int (i)=(int)(a); (i)!=(int)(b); ++(i))
#define MOD 1000000007
typedef unsigned long long int ulli;
int solve_small(vector<int> &A) {
int P=1, N=0;
if (A[0]%2) swap(P, N);
FOR(i,1,A.size()) {
P = (P << 1) % MOD;
if (A[i]%2) swap(P, N);
}
return P;
}
int solve_n2(vector<int> &A) {
vector<int> T(A.size()+1, 0);
T[0] = 1;
FOR(i,0,A.size()) {
int S = 0;
FOR(j,0,i+1) {
S = (S + A[i-j]) % MOD;
if (S&1) continue;
T[i+1] = (T[i+1] + T[i-j]) % MOD;
}
}
return T[A.size()];
}
int solve(vector<int> &A) {
ulli sum = 0;
FOR(i,0,A.size()) sum += A[i];
if (sum < MOD) return solve_small(A);
return solve_n2(A);
}
int n;
vector<int> A;
int main() {
scanf("%d", &n); A.resize(n);
FOR(i,0,n) scanf("%d", &A[i]);
int result = solve(A);
printf("%d\n", result);
}
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 | #include <cstdio> #include <vector> using namespace std; #define FOR(i,a,b) for(int (i)=(int)(a); (i)!=(int)(b); ++(i)) #define MOD 1000000007 typedef unsigned long long int ulli; int solve_small(vector<int> &A) { int P=1, N=0; if (A[0]%2) swap(P, N); FOR(i,1,A.size()) { P = (P << 1) % MOD; if (A[i]%2) swap(P, N); } return P; } int solve_n2(vector<int> &A) { vector<int> T(A.size()+1, 0); T[0] = 1; FOR(i,0,A.size()) { int S = 0; FOR(j,0,i+1) { S = (S + A[i-j]) % MOD; if (S&1) continue; T[i+1] = (T[i+1] + T[i-j]) % MOD; } } return T[A.size()]; } int solve(vector<int> &A) { ulli sum = 0; FOR(i,0,A.size()) sum += A[i]; if (sum < MOD) return solve_small(A); return solve_n2(A); } int n; vector<int> A; int main() { scanf("%d", &n); A.resize(n); FOR(i,0,n) scanf("%d", &A[i]); int result = solve(A); printf("%d\n", result); } |
English