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.Collections;
//using System.Collections.Generic;
 
class TEST{
	static void Main(){
		Sol mySol =new Sol();
		mySol.Solve();
	}
}

class Sol{
	public void Solve(){
		String s="";
		while(true){
			if((s=rs())==null)return;
			var d=s.Split(' ');
			N=int.Parse(d[0]);
			S=int.Parse(d[1]);
			if(S>=400 || N>10){
				Console.WriteLine("0");
			}else{
				Console.WriteLine("{0}",memo[N][S]);
			}
		}
	}
	
	
	void dfs(int[] route_,int sum){
		//if(sum>S)return;
		int[] route=new int[10];
		int[] used=new int[10];
		for(int i=0;i<10;i++)used[i]=0;
		int now=-1;
		for(int i=0;i<10;i++){
			route[i]=route_[i];
			if(route[i]!=-1){
				now=i;
				used[route[i]]=1;
			}
		}
		sum+=(now+1)*route[now];
		memo[now+1][sum]+=1;
		if(now==10-1){
			//if(S==sum)Ans++;
			return;
		}
	
		for(int i=0;i<=9;i++){
			if(used[i]==0){
				route[now+1]=i;
				dfs(route,sum);
				route[now+1]=-1;
			}
		}
		sum-=(now+1)*route[now];
		return;
	
	}
	
	
	int[][] memo;
	int N;
	int S;
	public Sol(){
		memo=new int[11][];
		for(int i=0;i<=10;i++){
			memo[i]=new int[400];
			for(int j=0;j<400;j++)memo[i][j]=0;
		}
		int[] route=new int[10];
		for(int i=0;i<10;i++)route[i]=-1;
		for(int i=0;i<=9;i++){
			int sum=0;
			route[0]=i;
			dfs(route,sum);
			route[0]=-1;
		}

	}




	static String rs(){return Console.ReadLine();}
	static int ri(){return int.Parse(Console.ReadLine());}
	static long rl(){return long.Parse(Console.ReadLine());}
	static double rd(){return double.Parse(Console.ReadLine());}
	static String[] rsa(){return Console.ReadLine().Split(' ');}
	static int[] ria(){return Array.ConvertAll(Console.ReadLine().Split(' '),e=>int.Parse(e));}
	static long[] rla(){return Array.ConvertAll(Console.ReadLine().Split(' '),e=>long.Parse(e));}
	static double[] rda(){return Array.ConvertAll(Console.ReadLine().Split(' '),e=>double.Parse(e));}
}