#include <time.h>
#include <iostream>
#include <vector>

int young_sub(int n, int d, std::vector<int>& stack)
{
	if (n <= 0)
	{
		for (std::vector<int>::iterator li = stack.begin(); li != stack.end(); li++)
		{
			int n = *li;
			while (n--) { std::cout << "□"; }
			std::cout << std::endl;
		}
		std::cout << std::endl;
		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;
}
