P (n) n, n , n >= 1.
p (n, k) n , k, k , k >= 1, k <= n.
, P (n) = sum (i: 1..n) p (n, i).
p (n, k), , , : . , 1 k, n , .
, p (n, k) = sum (i: 1..k) p (n - i, i).
p (1, 1) = 1.
, , ( ) - !
template <typename T>
vector<T> operator<<(vector<T> copy, T to_append) {
copy.push_back(to_append);
return copy;
}
template <typename T>
vector<T>& operator+=(vector<T>& original, const vector<T>& to_append) {
copy(to_append.begin(), to_append.end(), back_inserter(original));
return original;
}
vector<vector<int> > partitions(int remaining, int limit, vector<int> prefix) {
limit = max(remaining, limit);
vector<vector<int> > result;
if (remaining == 1) {
return result << (prefix << 1);
}
for (int i = limit; i > 0; --i) {
result += partitions(remaining - i, i, prefix << i);
}
return result;
}