Problem:
Combination of Number Sequences

0 から 9 までの整数を使った n 個の数の並び k1, k2, ..., kn を考えます。正の整数 n と s を読み込んで、

k1 + 2 × k2 + 3 × k3 + ... + n × kn = s

となっているような n 個の数の並びが何通りあるかを出力するプログラムを作成してください。ただし、1 つの「n 個の数の並び」には同じ数が 2 回以上現われないものとします。

Input

入力は複数のデータセットからなります。各データセットとして、n (1 ≤ n ≤ 10) と s (0 ≤ s ≤ 10,000)が空白区切りで１行に与えられます。

データセットの数は 100 を超えません。

Output

データセットごとに、n 個の整数の和が s になる組み合わせの個数を１行に出力します。

Sample Input

3 10
3 1

Output for the Sample Input

8
0

Solution in C# (judge verdict: Time Limit Exceeded)

using System;
using System.Linq;

namespace _070_CombinationofNumberSequences
{
	class Program
	{
		static void Main ( string[] args )
		{
			string inputStr;

			int[] numArray = Enumerable.Range (1, 9).ToArray ();
			int limit = numArray.Aggregate (0, ( sum, num ) => sum + num * num);

			while ((inputStr = Console.ReadLine ()) != null)
			{
				int[] inputNum = inputStr.Split (' ').Select (int.Parse).ToArray ();

				int count = 0;

				if (inputNum[1] <= limit)
				{
					count = Combination.CombinationCount (inputNum[0], inputNum[1]);
				}

				Console.WriteLine (count);
			}
		}

		static class Combination
		{
			private static int Count { set; get; }

			private const int End = 0;
			private const int Over = -1;

			public static int CombinationCount ( int leftCount, int sum )
			{
				Count = 0;
				bool[] boolArray = new bool[10];
				CombinationCount (leftCount, 1, sum, boolArray);
				return Count;
			}

			private static int CombinationCount ( int leftCount, int multiple, int sum, bool[] useNumArray )
			{
				if (leftCount < 0)
				{
					return End;
				}
				else if (sum < 0)
				{
					return Over;
				}
				if (leftCount == 0 && sum == 0)
				{
					Count++;
					return End;
				}

				for (int lp = 0; lp <= 9; lp++)
				{
					if (!useNumArray[lp])
					{
						bool[] copy = new bool[10];
						useNumArray.CopyTo (copy, 0);
						copy[lp] = true;

						int result = CombinationCount (leftCount - 1, multiple + 1, sum - lp * multiple, copy);

						if (result == Over)
						{
							break;
						}
					}
				}

				return End;
			}

		}
	}
}