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 JAVA (judge verdict: Time Limit Exceeded)


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader bin = new BufferedReader(new InputStreamReader(System.in));
		String str;
		int q = 0;
		while ((str = bin.readLine()) != null) {
			q++;
			String[] strs = str.split(" ");
			final int n = Integer.parseInt(strs[0]);
			final int s = Integer.parseInt(strs[1]);

			int num = 9, val = 0;
			for (int i = n; i > 0; i--) {
				val += (num * (n * i));
			}
			int count = 0;
			if (val > s) {
				count = count(n, s, new boolean[10], 0);
			}
			System.out.println(count);
			if (q > 100) { throw new IOException(); }
		}
	}

	static int count(int n, int s, boolean[] unUse, int count) {
		if (s < 0 || n < 1) {
			return count;
		} else if (n == 1) {
			if (s < 10 && !unUse[s]) {
				return count + 1;
			} else return count;
		}
		for (int i = unUse.length - 1; i >= 0; i--) {
			int s2 = s - i * n;
			if (!unUse[i] && s2 > 0) {
				unUse[i] = true;
				count = count(n - 1, s2, unUse, count);
				unUse[i] = false;

			}
		}

		return count;
	}
}