#include <iostream>
#include <map>
#include <set>
#include <vector>
#include <algorithm>
using namespace std;
map<long long, long long> m;
long long over;
//long long m[25000100];
multiset<long long> s;
int main() {
// your code goes here
long long n;
scanf("%lld",&n);
while(n--)
{
long long k;
scanf("%lld",&k);
s.insert(k);
}
long long maxk = *s.rbegin();
m[0]=1;
for_each(s.begin(),s.end(),[&](auto k){
over*=2;
over%=1000000007;
vector<pair<long long, long long>>t;
for_each(m.rbegin(),m.rend(),[&](auto i){
if(i.first>=k-1)
{
if((i.first+k)>maxk+1)over+=i.second;
else t.push_back(make_pair(i.first+k,i.second));
over%=1000000007;
}
});
for_each(t.begin(),t.end(),[&](auto i){
m[i.first]+=i.second;
m[i.first]%=1000000007;
});
});
long long sum=over;
for_each(m.begin(),m.end(),[&](auto i){
// printf("[%d]:%d ",i.first,i.second);
sum+=i.second;
sum%=1000000007;
});
printf("%lld\n",sum-1);
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 | #include <iostream> #include <map> #include <set> #include <vector> #include <algorithm> using namespace std; map<long long, long long> m; long long over; //long long m[25000100]; multiset<long long> s; int main() { // your code goes here long long n; scanf("%lld",&n); while(n--) { long long k; scanf("%lld",&k); s.insert(k); } long long maxk = *s.rbegin(); m[0]=1; for_each(s.begin(),s.end(),[&](auto k){ over*=2; over%=1000000007; vector<pair<long long, long long>>t; for_each(m.rbegin(),m.rend(),[&](auto i){ if(i.first>=k-1) { if((i.first+k)>maxk+1)over+=i.second; else t.push_back(make_pair(i.first+k,i.second)); over%=1000000007; } }); for_each(t.begin(),t.end(),[&](auto i){ m[i.first]+=i.second; m[i.first]%=1000000007; }); }); long long sum=over; for_each(m.begin(),m.end(),[&](auto i){ // printf("[%d]:%d ",i.first,i.second); sum+=i.second; sum%=1000000007; }); printf("%lld\n",sum-1); return 0; } |
English