using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 自然数
{
	class Program
	{
		static void Main(string[] args)
		{
			DateTime prev = DateTime.Now;
			young(50);
			Console.WriteLine((DateTime.Now - prev).TotalSeconds);
		}

		static void young(int n)
		{
			List<int[]> youngList = new List<int[]>();
			Stack<int> stack = new Stack<int>();

			for( int i = n ; i > 0 ; --i )
				subYoung( youngList, stack, i, n-i );

			var x = from y in youngList
					orderby y.Count() ascending
					select y;

			foreach (int[] list in x)
			{
				foreach (int i in list)
					Console.WriteLine( new string( '□', i ) );

				Console.WriteLine();
			}

			Console.WriteLine(youngList.Count());
		}

		static void subYoung( List<int[]> youngList, Stack<int> stack, int num, int zan )
		{
			stack.Push(num);

			if (zan == 0)
			{
				youngList.Add(stack.Reverse().ToArray());
			}
			else
			{
				for (int i = zan >= num ? num : zan; i > 0; --i)
				{
					subYoung(youngList, stack, i, zan - i);
				}
			}

			stack.Pop();
        }
	}
}
