考察
この問題は、「合計が\(X\)以下となる\(0\)以上の整数\(D-1\)個の組はいくつあるか」という問題に言い換えられます。そしてこの問題はベル数やスターリング数を求めるときのように、漸化式を立てることで数え上げることができます。
実装
オーバーフローに気をつけて実装する必要があります。こういった問題はメモ化再帰で解いたほうが楽な気がします。
long long memo[1510][1510]; long long f(int x, int d) { if (memo[x][d] > 0) { return memo[x][d]; } long long ret; if (x == 0) { ret = 1; } else if (d == 1) { ret = x + 1; } else { ret = f(x - 1, d) + f(x, d - 1); if (ret > 1e16) { ret = 1e16; } } return memo[x][d] = ret; } int main() { int Q; cin >> Q; for (int i = 0; i < Q; i++) { int d, x; long long t; cin >> d >> x >> t; if (d == 1) { if (t > 0) { cout << "AC" << endl; } else { cout << "ZETUBOU" << endl; } } else { if (f(x, d - 1) <= t) { cout << "AC" << endl; } else { cout << "ZETUBOU" << endl; } } } return 0; }
感想
漸化式を立てて数え上げる系の問題は解けるとけっこう嬉しいです。