#include <iostream>
#include <string>
#include <vector>



typedef struct _value
{
	size_t count_char;
	char _ch;
}value_t;


//Cac hoan vi cua 1 tich (X1^m1)(X2^m2)...(Xn^mn)
void enumerate(std::vector<value_t>& a, size_t total_char, size_t number_char, size_t current)
{
	size_t l;
	static char result[128] = { 0 };
	static bool first = true;
	if (current >= total_char)
	{
		result[total_char] = 0;
		if (first)
		{
			first = false;
			std::cout << std::string(result);
			return;
		}
		std::cout << std::string(" + ") << std::string(result);
		return;
	}
	for (l = 0; l < number_char; l++)
	{
		if (a[l].count_char > 0)
		{
			a[l].count_char--;
			result[current] = a[l]._ch;
			enumerate(a, total_char, number_char, current + 1);
			a[l].count_char++;
		}
	}
}


//giai phuong trinh M1 + M2 + ... + Mn = K (voi Mi >= 0, va K la so nguyen duong)
void solve_m(std::vector<size_t>& M, size_t K, size_t idx, size_t sum)
{
	size_t i;

	if ((sum > K) || idx > M.size())
		return;
	if (sum == K)
	{
		bool valid = true;
		size_t number_char = 0;
		std::vector<value_t> vv;
		for (i = 0; i < M.size(); i++)
		{
			if (M[i] == 1)
				return;
			if (M[i] > 0)
			{
				value_t v;
				v._ch = static_cast<char>('A' + i);
				v.count_char = M[i];
				number_char += M[i];
				vv.push_back(v);
			}
		}
		enumerate(vv, number_char, vv.size(), 0);
		return;
	}

	if (idx < M.size())
	{
		for (i = K + 1; i > 0; i--)
		{
			M[idx] = i - 1;
			solve_m(M, K, idx + 1, sum + i - 1);
			M[idx] = 0;
		}
	}

}

int main()
{
	std::vector<size_t> M;

	size_t K = 6; //so mu (X1 + ... Xn)^K
	size_t n = 7; //so luong phan tu (X1 + X2 + .. + Xn)
	size_t i;

	for (i = 0; i < n; i++)
		M.push_back(0);

	solve_m(M, K, 0, 0);
	std::cout << std::endl;
	return 0;
}
