#include <iostream>
#include <vector>
using namespace std;
class Solution
{
public:
Solution(int startingCapacity = 100) { sol.reserve(startingCapacity); }
void Print()
{
if (sol.empty())
{
cout << "== empty ==";
}
else
{
cout << sol[0];
}
for (size_t i = 1; i < sol.size(); i++)
{
cout << " " << sol[i];
}
cout << "\n";
}
bool HasValidSize()
{
return sol.size() >= 2;
}
void Push(int number) { sol.push_back(number); }
void Pop() { sol.pop_back(); }
private:
vector<int> sol;
};
class Solver
{
public:
Solver(const vector<int>& v) : input(v), sol(v.size()) {}
int PrintSolutions(int sum)
{
noSolutionsPrinted = 0;
PrintSolutions(0, sum);
return noSolutionsPrinted;
}
private:
const vector<int> input;
Solution sol;
int noSolutionsPrinted;
void PrintSolutions(int startIndex, int sum)
{
if (sum < 0 || startIndex == input.size()) return;
if (sum == 0 && sol.HasValidSize())
{
sol.Print();
noSolutionsPrinted++;
return;
}
for (size_t i = startIndex; i < input.size(); i++)
{
sol.Push(input[i]);
PrintSolutions(i + 1, sum - input[i]);
sol.Pop();
}
}
};
int main()
{
vector<int> v;
int n, k;
cin >> n >> k;
v.reserve(n);
while (n--)
{
int a;
cin >> a;
v.push_back(a);
}
Solver sol(v);
cout << "Total number of solutions: " << sol.PrintSolutions(k) << "\n";
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIFNvbHV0aW9uCnsKcHVibGljOgogIFNvbHV0aW9uKGludCBzdGFydGluZ0NhcGFjaXR5ID0gMTAwKSB7IHNvbC5yZXNlcnZlKHN0YXJ0aW5nQ2FwYWNpdHkpOyB9CiAgdm9pZCBQcmludCgpCiAgewogIAlpZiAoc29sLmVtcHR5KCkpCiAgCXsKICAJCWNvdXQgPDwgIj09IGVtcHR5ID09IjsKICAJfQogIAllbHNlCiAgCXsKICAJCWNvdXQgPDwgc29sWzBdOwogIAl9CiAgCWZvciAoc2l6ZV90IGkgPSAxOyBpIDwgc29sLnNpemUoKTsgaSsrKQogIAl7CiAgCQljb3V0IDw8ICIgIiA8PCBzb2xbaV07CiAgCX0KICAJY291dCA8PCAiXG4iOwogIH0KICBib29sIEhhc1ZhbGlkU2l6ZSgpCiAgewogIAlyZXR1cm4gc29sLnNpemUoKSA+PSAyOwogIH0KICB2b2lkIFB1c2goaW50IG51bWJlcikgeyBzb2wucHVzaF9iYWNrKG51bWJlcik7IH0KICB2b2lkIFBvcCgpIHsgc29sLnBvcF9iYWNrKCk7IH0KcHJpdmF0ZToKICB2ZWN0b3I8aW50PiBzb2w7Cn07CgpjbGFzcyBTb2x2ZXIKewpwdWJsaWM6CiAgU29sdmVyKGNvbnN0IHZlY3RvcjxpbnQ+JiB2KSA6IGlucHV0KHYpLCBzb2wodi5zaXplKCkpIHt9CiAgaW50IFByaW50U29sdXRpb25zKGludCBzdW0pCiAgewogIAlub1NvbHV0aW9uc1ByaW50ZWQgPSAwOwogIAlQcmludFNvbHV0aW9ucygwLCBzdW0pOwogIAlyZXR1cm4gbm9Tb2x1dGlvbnNQcmludGVkOwogIH0KICAKcHJpdmF0ZToKICBjb25zdCB2ZWN0b3I8aW50PiBpbnB1dDsKICBTb2x1dGlvbiBzb2w7CiAgaW50IG5vU29sdXRpb25zUHJpbnRlZDsKICAKICB2b2lkIFByaW50U29sdXRpb25zKGludCBzdGFydEluZGV4LCBpbnQgc3VtKQogIHsKICAJaWYgKHN1bSA8IDAgfHwgc3RhcnRJbmRleCA9PSBpbnB1dC5zaXplKCkpIHJldHVybjsKICAJaWYgKHN1bSA9PSAwICYmIHNvbC5IYXNWYWxpZFNpemUoKSkKICAJewogIAkJc29sLlByaW50KCk7CiAgCQlub1NvbHV0aW9uc1ByaW50ZWQrKzsKICAJCXJldHVybjsKICAJfQogICAgZm9yIChzaXplX3QgaSA9IHN0YXJ0SW5kZXg7IGkgPCBpbnB1dC5zaXplKCk7IGkrKykKICAgIHsKICAgIAlzb2wuUHVzaChpbnB1dFtpXSk7CiAgICAJUHJpbnRTb2x1dGlvbnMoaSArIDEsIHN1bSAtIGlucHV0W2ldKTsKICAgIAlzb2wuUG9wKCk7CiAgICB9CiAgfQp9OwoKaW50IG1haW4oKQp7Cgl2ZWN0b3I8aW50PiB2OwoJaW50IG4sIGs7CgljaW4gPj4gbiA+PiBrOwoJdi5yZXNlcnZlKG4pOwoJd2hpbGUgKG4tLSkKCXsKCQlpbnQgYTsKCQljaW4gPj4gYTsKCQl2LnB1c2hfYmFjayhhKTsKCX0KCVNvbHZlciBzb2wodik7Cgljb3V0IDw8ICJUb3RhbCBudW1iZXIgb2Ygc29sdXRpb25zOiAiIDw8IHNvbC5QcmludFNvbHV0aW9ucyhrKSA8PCAiXG4iOwoJcmV0dXJuIDA7Cn0=