#include <time.h>
#include <iostream>
#include <vector>

int young_sub(int n, int d, std::vector<int>& stack)
{
	if ((n <= 0) || (d == 1))
	{
		std::string s("");
		for (std::vector<int>::iterator li = stack.begin(); li != stack.end(); li++)
		{
			int v = *li;
			while (v--) { s.append("□"); }
			s.append("\n");
		}
		for (int j = n; j > 0; j--) { s.append("□\n"); }
		s.append("\n");

		std::cout << s.c_str();
		return 1;
	}

	int count = 0;
	for (int i = ((n < d) ? n : d); i > 0; i--)
	{
		stack.push_back(i);
		count += young_sub(n - i, i, stack);
		stack.pop_back();
	}
	return count;
}

int young(int n)
{
	if (n < 1)
		return 0;
	std::vector<int> stack;
	stack.reserve(n);
	return young_sub(n, n, stack);
}

int main(int argc, char* argv[])
{
	if (argc < 2)
		return -1;
	int v = atoi(argv[1]);

	clock_t s = clock();
	int count = young(v);
	clock_t e = clock();

	std::cout << "count:"   << count << std::endl;
	std::cout << "time[s]:" << ((double)(e-s)/CLOCKS_PER_SEC) << std::endl;
	return count;
}
