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>
#include <stdlib.h>


int s;
int count = 0;

void perm(int* list, int listSize, int r, int* p, int size) {
	int* p2;
	int* copy;
	int sum = 0;
	int i, j, c;
	if (size == r) {
		sum = 0;
		for (i = 0; i < size; i++) {
			sum += p[i] * (i+1);
		}
		if (sum == s) {
			count++;
		}
		/*
		for (j = 0; j < size; j++ ) {
			printf("%d", p[j]);
		}
		printf("\n");
		*/
	} else {
		for (i = 0; i < listSize; i++) {

			p2 = (int*)malloc(sizeof(int) * (size + 1));
			if (p2 == NULL) {
				printf("malloc for p2 failed\n");
			}
			memcpy(p2, p, sizeof(int) * size);
			p2[size] = list[i];

			copy = (int*) malloc(sizeof(int) * (listSize - 1));
			if (copy == NULL) {
				printf("malloc for copy failed\n");
			}
			c = 0;
			for (j = 0; j < listSize; j++) {
				if (j != i) {
					copy[c] = list[j];
					c++;
				}
			}
			perm(copy, listSize - 1, r, p2, size + 1);
			if (p2) {
				free(p2);
			}
			if (copy) {
				free(copy);
			}
		}
	}
}

int main(void) {
	int list[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
	int n;
	while(scanf("%d %d", &n, &s) != EOF) {
		count = 0;
		perm(list, 10, n, 0, 0);
		printf("%d\n", count);
	}
	return 0;
}