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
79
80
81
82
83
// Task: CUK

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main(){
    int n;

    cin >> n;

    // Illustration:
    //
    // * a = 1(1)
    // ** b = 1(2)
    // **** c = 2(4)
    // ****
    // ******* d = 1(7)

    vector<int> packs;

    packs.reserve(n);

    int sweetCount;

    for (int i = 0; i < n; ++i) {
        cin >> sweetCount;

        packs.push_back(sweetCount);
    }

    sort(packs.begin(), packs.end());

    const long long MODULUS = 1000000007;

    long long subsetCount = 0;

    int currentSum = 0;

    long long previousCombinations = 1;

    int i = 0;

    while (i < n) {
        int currentPackSize = packs[i];

        if (currentPackSize > currentSum + 1){
            break;
        }

        int samePacksCount = 1;

        ++i;

        while (i < n && packs[i] == currentPackSize) {
            ++samePacksCount;

            ++i;
        }

        int currentCombinations = 1;

        for (int j = 0; j < samePacksCount; ++j) {
            currentCombinations = currentCombinations * 2 % MODULUS;
        }

        currentCombinations -= 1;// TODO: Makes sense if currentCombinations > 0

        int tmp = previousCombinations * currentCombinations % MODULUS;

        subsetCount = (subsetCount + tmp)%MODULUS;

        previousCombinations = currentCombinations;

        currentSum += samePacksCount*currentPackSize;
    }

    cout << subsetCount << endl;

    return 0;
}