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<cstdio>
#include<algorithm>
#include<vector>
#include<string>
#include<iostream>
#include<queue>
#include<map>
#include<set>
#include<complex>
#include<stack>
#include<cmath>
 
using namespace std;
 
#define reps(i,f,n) for(int i=f;i<int(n);i++)
#define rep(i,n) reps(i,0,n)

#ifdef __BORLANDC__
	typedef __int64 ll;
#else
	typedef long long ll;
#endif


const int N = 10;
int n;

typedef pair<int,int> pii;

map<pii,int> memo;

int saiki(int depth, int used, int lest){
	pii key = pii(used,lest);
	map<pii,int>::iterator it = memo.find(key);
	if(it!=memo.end())return it->second;
	
	if(lest<0)return it->second=0;
	if(depth==n){
		if(lest==0)return it->second=1;
		return it->second=0;
	}
	
	int ret = 0;
	rep(i,N){
		if((used&(1<<i))==0){
			ret += saiki(depth+1, used|(1<<i), lest-(depth+1)*i);
		}
	}
	return it->second=ret;
}

class Q{
	public:
	int i,n,s;
	Q(int i,int n,int s):i(i),n(n),s(s){}
	bool operator<(const Q& a)const{
		if(i!=a.i)return i<a.i;
		if(n!=a.n)return n<a.n;
		return s<a.s;
	}
};
int main(){
	vector<Q> in;
	int s,cnt=0;
	while(cin>>n>>s){
		if(n==0)break;
		in.push_back(Q(cnt,n,s));
		cnt++;
	}
	sort(in.begin(),in.end());
	
	vector<int> ans(in.size());
	rep(i,in.size()){
		if(i!=0 && in[i].n!=in[i-1].n){
			memo.clear();
		}
		
		n = in[i].n;
		ans[in[i].i]=saiki(0,0,in[i].s);
	}
	
	rep(i,ans.size()){
		printf("%d\n",ans[i]);
	}
}