#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); } |