#include <iostream>
#include <vector>
#include <array>
#include <chrono>
/// 読み込んだデータのつもり
struct Param
{
	int n;
	int s;
};

struct Data{
	short array_;
	int answer_;
	
	Data()
	: array_()
	, answer_(0)
	{}
	
	void setUseNumber(int number, bool flag) { 
		array_ = flag ? array_ | (1 << number) : array_ & (~(1 << number));
	}
	bool isUsingNumber(int number)const { return array_ & (1<<number);}
};

void recurcive(Data& data, const Param& param, int depth, int total)
{
	for(int i = 0; i < 10; i++)
	{

		// すでに使われているのでチェックしない
		if(data.isUsingNumber(i)){
			continue;
		}
		
		total += i*depth;

		// トータルより超えていたらこれ以上減ることはないので終わり
		if(total > param.s) {
			return;
		}

		data.setUseNumber(i, true);
		if(depth > 1) {
			::recurcive(data, param, depth-1, total);
		}
		else
		{
			if(param.s == total) {
				data.answer_++;
			}
		}

		total -= i*depth;
		data.setUseNumber(i, false);
	}
}


int main() {
    std::vector<Param> params;
    params.resize(100);
	Param p;
    while (std::cin >> p.n >> p.s)
    {
        if (p.n < 0 || p.n >= 10) {
            ::printf("0");
        }else{
            Data data;
    	    ::recurcive(data, p, p.n, 0);
	        ::printf("%d\n", data.answer_);
        }

    }
	return 0;
}