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)

#include <stdio.h>
#include <string.h>

#define COMBI_NO (1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10)


char table[COMBI_NO][9];
int table_no;
int use[10];

void make_table(int depth)
{
	int i;

	if (depth == 0){
		table_no++;
		return;
	}
	
	for (i = 0; i < 10; i++){
		if (use[i] == 0){
			use[i] = 1;
			table[table_no][depth - 1] = i;
			make_table(depth - 1);
		 	use[i] = 0;
		}
	}
}


int main(void)
{
	int i, j;
	int n, s;
	int sum;
	int cnt;
	
	memset(table, 0xff, sizeof(table));
	make_table(9);

	
	for (i = 0; i < COMBI_NO; i++){
		for (j = 0; j < 9; j++){
			if (table[i][j] == -1){
				table[i][j] = table[i - 1][j];
			}
		}
	}
#if 0
	for (i = 0; i < COMBI_NO; i++){
		for (j = 0; j < 9; j++){
			printf("%d", table[i][j]);
		}
		printf("\n");
	}
#endif
	while (scanf("%d%d", &n, &s) != EOF){
		cnt = 0;
		
		for (i = 0; i < COMBI_NO; i++){
			sum = 0;
			for (j = 1; j <= n; j++){
				if (j < 10){
					sum += j * table[i][j];
				}
				else {
					sum += j * (45 - table[i][0] - table[i][1] - table[i][2] - table[i][3] - table[i][4] -
								     table[i][5] - table[i][6] - table[i][7] - table[i][8] - table[i][9]);
				}
			}
			if (sum == s){
				cnt++;
			}
		}

		for (i = 2; i <= 10 - n; i++){
			cnt /= i;
		}
		
		
		printf("%d\n", cnt);

	}
	return (0);
}