#include <set> #include <map> #include <utility> #include <deque> #include <vector> #include <algorithm> #include <stdexcept> constexpr int MAX = 5001; constexpr long MOD = 1000000007; int n; int inputs[MAX]; int jump_down[MAX * MAX]; int jump_up[MAX * MAX]; long counts[MAX * MAX]; long max_count = 0; long result = 0; int ones = 0; int non_ones = 0; // 1 // 2 1 // 3 3 1 // 6 6 4 1 int main() { scanf("%d\n", &n); for (int i=0; i<n; i++) { int input; scanf("%d", &input); if (input == 1) { ones ++; } else { inputs[non_ones++] = input; } } for (int i=0; i<ones; i++) { for (int j = i + 1; j >= 2; j--) { counts[j] = (counts[j] + counts[j-1]) % MOD; } counts[1]++; } max_count = ones; for (int i=1; i<=max_count; i++) { result = (result + counts[i]) % MOD; jump_down[i] = i-1; jump_up[i-1] = i; } std::sort(inputs, inputs + non_ones); for (int i =0 ; i< non_ones; i++) {// int input = inputs[i]; // printf("input = %d\n", input); // fflush(stdout); int c = max_count; while(c >= input - 1) { // printf("c = %d\n", c); // fflush(stdout); int ci = c + input; // printf("ci = %d\n", ci); // fflush(stdout); result = (result + counts[c]) % MOD; int counts_ci_prev = counts[ci]; counts[ci] = (counts[ci] + counts[c]) % MOD; if (counts_ci_prev == 0 && counts[ci] > 0) { if (c == max_count) { max_count = ci; } if (jump_down[ci] == 0) { int d = ci - 1; while (d > 0 && counts[d] == 0) { d --; } if (counts[d] > 0) { jump_down[ci] = d; jump_up[ci] = jump_up[d]; if (jump_up[d] > 0) { jump_down[jump_up[d]] = ci; } jump_up[d] = ci; } } } c = jump_down[c]; } // // for (int j =0 ;j<=max_count; j++) { // printf("counts[%d]=%ld\n", j, counts[j]); // }////// } // for (int i=0; i<=max_count; i++) { // printf("%d: %d %d\n", i, counts[i], jump_to[i]); // } printf("%ld\n", result); 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 | #include <set> #include <map> #include <utility> #include <deque> #include <vector> #include <algorithm> #include <stdexcept> constexpr int MAX = 5001; constexpr long MOD = 1000000007; int n; int inputs[MAX]; int jump_down[MAX * MAX]; int jump_up[MAX * MAX]; long counts[MAX * MAX]; long max_count = 0; long result = 0; int ones = 0; int non_ones = 0; // 1 // 2 1 // 3 3 1 // 6 6 4 1 int main() { scanf("%d\n", &n); for (int i=0; i<n; i++) { int input; scanf("%d", &input); if (input == 1) { ones ++; } else { inputs[non_ones++] = input; } } for (int i=0; i<ones; i++) { for (int j = i + 1; j >= 2; j--) { counts[j] = (counts[j] + counts[j-1]) % MOD; } counts[1]++; } max_count = ones; for (int i=1; i<=max_count; i++) { result = (result + counts[i]) % MOD; jump_down[i] = i-1; jump_up[i-1] = i; } std::sort(inputs, inputs + non_ones); for (int i =0 ; i< non_ones; i++) {// int input = inputs[i]; // printf("input = %d\n", input); // fflush(stdout); int c = max_count; while(c >= input - 1) { // printf("c = %d\n", c); // fflush(stdout); int ci = c + input; // printf("ci = %d\n", ci); // fflush(stdout); result = (result + counts[c]) % MOD; int counts_ci_prev = counts[ci]; counts[ci] = (counts[ci] + counts[c]) % MOD; if (counts_ci_prev == 0 && counts[ci] > 0) { if (c == max_count) { max_count = ci; } if (jump_down[ci] == 0) { int d = ci - 1; while (d > 0 && counts[d] == 0) { d --; } if (counts[d] > 0) { jump_down[ci] = d; jump_up[ci] = jump_up[d]; if (jump_up[d] > 0) { jump_down[jump_up[d]] = ci; } jump_up[d] = ci; } } } c = jump_down[c]; } // // for (int j =0 ;j<=max_count; j++) { // printf("counts[%d]=%ld\n", j, counts[j]); // }////// } // for (int i=0; i<=max_count; i++) { // printf("%d: %d %d\n", i, counts[i], jump_to[i]); // } printf("%ld\n", result); return 0; } |