#include<bits/stdc++.h>
using namespace std;
int tab[5010];
long long plecak[5010];
long long potegi[5010];
int main()
{
int n, i, j;
scanf("%d", &n);
for(i=0;i<n;i++)
{
scanf("%d", &tab[i]);
}
long long p=1;
for(i=0;i<=n;i++)
{
potegi[i] = p;
p*=2;
p%=1000000007;
}
sort(tab,tab+n);
plecak[0] = 1;
long long wynik=0;
for(i=0;i<n;i++)
{
//printf("%d: ", tab[i]);
for(j=4998;j>=tab[i]-1;j--)
{
if(j+tab[i]>=4999)
{
wynik+=plecak[j]*potegi[n-i-1];
wynik%=1000000007;
}
else
{
plecak[j+tab[i]]+=plecak[j];
plecak[j+tab[i]]%=1000000007;
//if(plecak[j]>0)
// printf("%d %lld ", j+tab[i], plecak[j+tab[i]]);
}
}
//printf("\n");
}
for(i=1;i<4999;i++)
{
wynik+=plecak[i];
wynik%=1000000007;
//if(i<20)
// printf("%lld ", plecak[i]);
}
printf("%lld", wynik);
}
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 | #include<bits/stdc++.h> using namespace std; int tab[5010]; long long plecak[5010]; long long potegi[5010]; int main() { int n, i, j; scanf("%d", &n); for(i=0;i<n;i++) { scanf("%d", &tab[i]); } long long p=1; for(i=0;i<=n;i++) { potegi[i] = p; p*=2; p%=1000000007; } sort(tab,tab+n); plecak[0] = 1; long long wynik=0; for(i=0;i<n;i++) { //printf("%d: ", tab[i]); for(j=4998;j>=tab[i]-1;j--) { if(j+tab[i]>=4999) { wynik+=plecak[j]*potegi[n-i-1]; wynik%=1000000007; } else { plecak[j+tab[i]]+=plecak[j]; plecak[j+tab[i]]%=1000000007; //if(plecak[j]>0) // printf("%d %lld ", j+tab[i], plecak[j+tab[i]]); } } //printf("\n"); } for(i=1;i<4999;i++) { wynik+=plecak[i]; wynik%=1000000007; //if(i<20) // printf("%lld ", plecak[i]); } printf("%lld", wynik); } |
English