AOJ 0070 Combination of Number Sequences
先に計算をしておく、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; }