#include <cstdio>
#include <algorithm>
#include <map>
#include <set>
#include <iterator>
using namespace std;
const int NMAX = 5000 + 7;
const int rest = 1000 * 1000 * 1000 + 7;
long long result_low = 0;
long long result_hight = 0;
int n;
int a[NMAX];
struct val {
long long int val = 0;
};
map<int, val> check;
int main() {
(void)! scanf("%d", &n);
for(int i = 0; i < n; i++) {
(void)! scanf("%d", &a[i]);
}
sort(a, a + n);
int hight_range = a[n - 1] + 2;
//check.insert(0);
check[0].val = 1;
for(int i = 0; i < n; i++) {
int x = a[i];
auto it = check.rbegin();
/*if(x == 1) {
check[x]++;
continue;
}*/
//if(x < hight_range)
result_hight = (result_hight * 2) % rest;
for(auto it = check.rbegin(); it != check.rend(); ++it) {
// printf("x: %d *it = %d\n", x, *it);
if(x <= it->first + 1) {
int w = it->first + x;
// ++it;
if(hight_range < w)
result_hight = (result_hight + it->second.val) % rest;
else
check[w].val = (check[w].val + it->second.val) % rest;
} else {
break;
}
}
for(auto it = check.begin(); it != check.end();) {
if(x <= it->first + 1)
break;
result_low = (result_low + it->second.val) % rest;
it = check.erase(it);
}
}
for(auto it = check.begin(); it != check.end();) {
result_low = (result_low + it->second.val) % rest;
it = check.erase(it);
}
/*for(auto it = check.begin(); it != check.end(); ++it) {
printf(".. %d %lld \n", it->first, it->second.val);
}*/
//printf("%lu\n", check.size());
//printf("%lld\n", result_hight);
printf("%lld\n", (result_low + result_hight + rest - 1) % rest);
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 | #include <cstdio> #include <algorithm> #include <map> #include <set> #include <iterator> using namespace std; const int NMAX = 5000 + 7; const int rest = 1000 * 1000 * 1000 + 7; long long result_low = 0; long long result_hight = 0; int n; int a[NMAX]; struct val { long long int val = 0; }; map<int, val> check; int main() { (void)! scanf("%d", &n); for(int i = 0; i < n; i++) { (void)! scanf("%d", &a[i]); } sort(a, a + n); int hight_range = a[n - 1] + 2; //check.insert(0); check[0].val = 1; for(int i = 0; i < n; i++) { int x = a[i]; auto it = check.rbegin(); /*if(x == 1) { check[x]++; continue; }*/ //if(x < hight_range) result_hight = (result_hight * 2) % rest; for(auto it = check.rbegin(); it != check.rend(); ++it) { // printf("x: %d *it = %d\n", x, *it); if(x <= it->first + 1) { int w = it->first + x; // ++it; if(hight_range < w) result_hight = (result_hight + it->second.val) % rest; else check[w].val = (check[w].val + it->second.val) % rest; } else { break; } } for(auto it = check.begin(); it != check.end();) { if(x <= it->first + 1) break; result_low = (result_low + it->second.val) % rest; it = check.erase(it); } } for(auto it = check.begin(); it != check.end();) { result_low = (result_low + it->second.val) % rest; it = check.erase(it); } /*for(auto it = check.begin(); it != check.end(); ++it) { printf(".. %d %lld \n", it->first, it->second.val); }*/ //printf("%lu\n", check.size()); //printf("%lld\n", result_hight); printf("%lld\n", (result_low + result_hight + rest - 1) % rest); return 0; } |
English