#include <cstdio>
#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>
using namespace std;
int main()
{
int n, a;
scanf("%d",&n);
vector<int> v;
for (int i=0; i<n; i++)
{
scanf("%d",&a);
v.push_back(a);
}
sort(v.begin(), v.end());
if (v[0] != 1)
{
printf("0\n");
return 0;
}
unordered_map<int, int> m1, m2;
int mod = 1000;
mod = mod*1000;
mod = mod*1000;
mod = mod+7;
unordered_map<int, int>::iterator it;
m1.reserve(50000);
m2.reserve(50000);
int result = 0;
m1[v[0]] = 1;
m2[v[0]] = 1;
for (int i=1; i<n; i++)
{
//cout << "v[i]: " << v[i] << endl;
//m2.clear();
if (v[i] == 1)
m2[1]++;
for ( it = m1.begin(); it != m1.end(); it++ )
{
//cout << it->first << ":" << it->second << " ";
if (it->first >= v[i]-1)
{
//if (m2.find(it->first+v[i]) == m2.end())
// m2[it->first+v[i]] = it->second;
//else
m2[it->first+v[i]] = (m2[it->first+v[i]] + it->second ) % mod;
}
else
{
//result = (result + it->second) % mod;
result = (result + it->second) % mod;
m2.erase(it->first);
}
}
//cout << endl;
//cout << "result: " << result << endl;
m1 = m2;
}
for ( it = m1.begin(); it != m1.end(); it++ )
{
//cout << it->first << ":" << it->second << " ";
result = (result + it->second) % mod;
}
printf("%d\n",result);
}
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 | #include <cstdio> #include <iostream> #include <vector> #include <unordered_map> #include <algorithm> using namespace std; int main() { int n, a; scanf("%d",&n); vector<int> v; for (int i=0; i<n; i++) { scanf("%d",&a); v.push_back(a); } sort(v.begin(), v.end()); if (v[0] != 1) { printf("0\n"); return 0; } unordered_map<int, int> m1, m2; int mod = 1000; mod = mod*1000; mod = mod*1000; mod = mod+7; unordered_map<int, int>::iterator it; m1.reserve(50000); m2.reserve(50000); int result = 0; m1[v[0]] = 1; m2[v[0]] = 1; for (int i=1; i<n; i++) { //cout << "v[i]: " << v[i] << endl; //m2.clear(); if (v[i] == 1) m2[1]++; for ( it = m1.begin(); it != m1.end(); it++ ) { //cout << it->first << ":" << it->second << " "; if (it->first >= v[i]-1) { //if (m2.find(it->first+v[i]) == m2.end()) // m2[it->first+v[i]] = it->second; //else m2[it->first+v[i]] = (m2[it->first+v[i]] + it->second ) % mod; } else { //result = (result + it->second) % mod; result = (result + it->second) % mod; m2.erase(it->first); } } //cout << endl; //cout << "result: " << result << endl; m1 = m2; } for ( it = m1.begin(); it != m1.end(); it++ ) { //cout << it->first << ":" << it->second << " "; result = (result + it->second) % mod; } printf("%d\n",result); } |
English