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 <iostream>
#include <string>
#include <algorithm>

using namespace std;

#define MAX_N 10
#define MAX_S 10000
int ans;
int N;

int choose[MAX_N];
int choose_size;
int rest[MAX_N];
int rest_size;

int rec() {
	if (choose_size == N) {
		int sum = 0;
		for (int i = 0; i < N; i++) {
			sum += (i + 1) * choose[i];
		}
		return ans == sum;
	}

	int cnt = 0;
	for (int i = 0; i < rest_size; i++) {
		choose[choose_size++] = rest[i];
		for (int j = i; j < rest_size-1; j++) {
			rest[j] = rest[j + 1];
		}
		rest_size--;
		
		cnt += rec();

		rest_size++;
		for (int j = rest_size-1; j > i; j--) {
			rest[j] = rest[j-1];
		}
		rest[i] = choose[--choose_size];
	}
	return cnt;
}

void q70() {
	int n, s;
	for (; cin >> n >> s;) {
		N = n;
		ans = s;
		choose_size = 0;
		for (int i = 0; i < MAX_N; i++) {
			rest[i] = i;
		}
		rest_size = 10;
		cout << rec() << endl;;
	}
}

int main() {
	q70();
	return 0;
}