#include <iostream> #include <algorithm> #include <set> #include <map> #include <vector> #define DEBUG0(x) x #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 BASE 1000000007LL #define MOD(n) (((long long)n)%BASE) using namespace std; const int MAX_N = 5001; int n; map<int, int> solutions; int input[MAX_N]; long long over5000 = 0LL; bool process(int input) { DEBUG(cerr<<"Processing "<<input<<endl;) // if (solutions.empty() && input == 1) { // solutions[1] = 1; // return true; // } auto end = solutions.lower_bound(input-1); if (end == solutions.end()) { DEBUG(cerr << "cannot match " << input << endl;) return false; } DEBUG(int affected = 0;) over5000 = MOD(over5000*2); for(auto iter = solutions.end(); iter-- != end;) { DEBUG(cerr << "can join with " << iter->first << " - " << iter->second << " times"<<endl; ++affected;) if (iter->first + input > 5000) over5000 = MOD(over5000 + iter->second); else solutions[iter->first + input] = MOD(solutions[iter->first + input] + iter->second); } DEBUG(cerr << "affected " << affected << endl;) return true; } int main() { ios_base::sync_with_stdio(0); cin >> n; REP(x,n) cin>>input[x]; sort(input, input+n); solutions[0] = 1; REP(x,n) if (!process(input[x])) break; long long sum = -1; FOREACH(it, solutions) sum = MOD(sum+it->second); cout<<MOD(sum+over5000); 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 | #include <iostream> #include <algorithm> #include <set> #include <map> #include <vector> #define DEBUG0(x) x #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 BASE 1000000007LL #define MOD(n) (((long long)n)%BASE) using namespace std; const int MAX_N = 5001; int n; map<int, int> solutions; int input[MAX_N]; long long over5000 = 0LL; bool process(int input) { DEBUG(cerr<<"Processing "<<input<<endl;) // if (solutions.empty() && input == 1) { // solutions[1] = 1; // return true; // } auto end = solutions.lower_bound(input-1); if (end == solutions.end()) { DEBUG(cerr << "cannot match " << input << endl;) return false; } DEBUG(int affected = 0;) over5000 = MOD(over5000*2); for(auto iter = solutions.end(); iter-- != end;) { DEBUG(cerr << "can join with " << iter->first << " - " << iter->second << " times"<<endl; ++affected;) if (iter->first + input > 5000) over5000 = MOD(over5000 + iter->second); else solutions[iter->first + input] = MOD(solutions[iter->first + input] + iter->second); } DEBUG(cerr << "affected " << affected << endl;) return true; } int main() { ios_base::sync_with_stdio(0); cin >> n; REP(x,n) cin>>input[x]; sort(input, input+n); solutions[0] = 1; REP(x,n) if (!process(input[x])) break; long long sum = -1; FOREACH(it, solutions) sum = MOD(sum+it->second); cout<<MOD(sum+over5000); return 0; } |