#include <iostream>
#include <algorithm>
#include <map>
#include <vector>
using namespace std;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
int n, i, sum = 0;
map<int, int>::iterator k;
cin >> n;
int* entries = new int[n]();
map<int, int> sets;
for (i = 0; i < n; i++)
{
cin >> entries[i];
}
sort(entries, entries + n);
vector<pair<int, int>> toAdd;
int largest = 0, newLargest = 0;
if (entries[0] == 1)
{
sets.insert(sets.begin(), { 1, 1 });
}
else
{
cout << 0 << '\n';
return 0;
}
for (i = 1; i < n; i++)
{
for (k = sets.lower_bound(entries[i] - 1); k != sets.end(); k++)
{
toAdd.push_back({ k->first + entries[i], k->second });
}
for (auto it : toAdd)
{
sets[it.first] += it.second;
if (sets[it.first] >= 1000000007) sets[it.first] -= 1000000007;
if (sum + it.second >= 1000000007) sum -= 1000000007;
sum += it.second;
}
toAdd.clear();
}
cout << sum + 1 << '\n';
}
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 | #include <iostream> #include <algorithm> #include <map> #include <vector> using namespace std; int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n, i, sum = 0; map<int, int>::iterator k; cin >> n; int* entries = new int[n](); map<int, int> sets; for (i = 0; i < n; i++) { cin >> entries[i]; } sort(entries, entries + n); vector<pair<int, int>> toAdd; int largest = 0, newLargest = 0; if (entries[0] == 1) { sets.insert(sets.begin(), { 1, 1 }); } else { cout << 0 << '\n'; return 0; } for (i = 1; i < n; i++) { for (k = sets.lower_bound(entries[i] - 1); k != sets.end(); k++) { toAdd.push_back({ k->first + entries[i], k->second }); } for (auto it : toAdd) { sets[it.first] += it.second; if (sets[it.first] >= 1000000007) sets[it.first] -= 1000000007; if (sum + it.second >= 1000000007) sum -= 1000000007; sum += it.second; } toAdd.clear(); } cout << sum + 1 << '\n'; } |
English