AOJ 0070 Combination of Number Sequences

組み合わせの個数 | Aizu Online Judge


先に計算をしておく、s > 330 の場合はないので0個にしてしまう
(最大の数1*0+2*1+3*2+4*3+5*4+6*5+7*6+8*7+9*8*10*9=330であるため)

#include <iostream>
using namespace std;

int n, s, res[10][330] = { 0 };
bool num[10] = { 0 };
void combinations(int c, int sum) {
	if (c == 11) return ;
	for (int i = 0; i < 10; i++) {
		if (num[i]) continue;
		num[i] = 1;
		++res[c + 1][sum + i * (c + 1)];
		combinations(c + 1, sum + i * (c + 1));
		num[i] = 0;
	}
}

int main() {
	combinations(0, 0);
	while (cin >> n) {
		cin >> s;
		if (s > 330) {
			n = 0;
			s = 0;
		}
		cout << res[n][s] << endl;
	}
	return 0;
}