#include <iostream> #include <set> #include <vector> #include <algorithm> #include <cstring> using namespace std; //#undef _HOME_ #ifdef _HOME_ #define DEBUG(x) x #else #define DEBUG(x) #endif #define REP(x,n) for(int x=0;x<(n);++x) #define FOREACH(x,n) for(__typeof(n.begin()) x = (n).begin(); x != (n).end(); ++x) #define RESULT(x) {cout<<(x);return 0;} typedef long long LL; const int MAX_N = 300001; const LL BASE = 1000000007LL; LL tab[MAX_N]; LL sumLeft[MAX_N]; int n; const LL cut(LL x) { return x%BASE; } // all groups are below BASE - can be divided in all even groups LL heura1() { if (sumLeft[n-1]&1) return 0; LL result = 1; int groups = 0; REP(x,n) if (!(sumLeft[x]&1)) { ++groups; DEBUG(cerr<<"cut at "<<x<<endl;) } REP(x,groups-1) result = cut(result<<1); return result; } // max 3000 items const int MID_N = 3001; LL solveHeur(int start) { LL result = 0; LL startVal = start ? sumLeft[start-1] : 0; for(int x=start;x<n-1;++x) if (!(cut(sumLeft[x]-startVal)&1)) result += solveHeur(x+1); if (!(cut(sumLeft[n-1]-startVal)&1)) return result+1; return result; } LL heura2() { return solveHeur(0); } int main() { ios_base::sync_with_stdio(0); cin>>n; LL sum = 0; REP(x,n) { cin>>tab[x]; sum = sum+tab[x]; sumLeft[x] = sum; } if (sum < BASE) RESULT(heura1()) else if(n <= 3000) RESULT(heura2()) else RESULT("NOPE") }
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 | #include <iostream> #include <set> #include <vector> #include <algorithm> #include <cstring> using namespace std; //#undef _HOME_ #ifdef _HOME_ #define DEBUG(x) x #else #define DEBUG(x) #endif #define REP(x,n) for(int x=0;x<(n);++x) #define FOREACH(x,n) for(__typeof(n.begin()) x = (n).begin(); x != (n).end(); ++x) #define RESULT(x) {cout<<(x);return 0;} typedef long long LL; const int MAX_N = 300001; const LL BASE = 1000000007LL; LL tab[MAX_N]; LL sumLeft[MAX_N]; int n; const LL cut(LL x) { return x%BASE; } // all groups are below BASE - can be divided in all even groups LL heura1() { if (sumLeft[n-1]&1) return 0; LL result = 1; int groups = 0; REP(x,n) if (!(sumLeft[x]&1)) { ++groups; DEBUG(cerr<<"cut at "<<x<<endl;) } REP(x,groups-1) result = cut(result<<1); return result; } // max 3000 items const int MID_N = 3001; LL solveHeur(int start) { LL result = 0; LL startVal = start ? sumLeft[start-1] : 0; for(int x=start;x<n-1;++x) if (!(cut(sumLeft[x]-startVal)&1)) result += solveHeur(x+1); if (!(cut(sumLeft[n-1]-startVal)&1)) return result+1; return result; } LL heura2() { return solveHeur(0); } int main() { ios_base::sync_with_stdio(0); cin>>n; LL sum = 0; REP(x,n) { cin>>tab[x]; sum = sum+tab[x]; sumLeft[x] = sum; } if (sum < BASE) RESULT(heura1()) else if(n <= 3000) RESULT(heura2()) else RESULT("NOPE") } |