ABC473 D - Coefficient Stair

係数階段

考え方

それぞれ、$i$ を $A_i$ 個用意して、合計 $K$ になるようにせよ、という意味である。
これは再帰による深さ優先探索で調べればよい。

例えば「3以下で8の和を作る」となったら、以下を調べる。

使える最大数を $1$ つずつ小さくしていき、「1以下で $x$ を作る」になったら $1$ を $x$ 個用意すればよい。

もちろんこれでは見つける順序がぐちゃぐちゃだが、辞書順は出力前に普通にソートすればよい。

計算量は、文字式で示すのは難しいが、答えが $M=3\times 10^5$ 個以下である保証がある。
それの $N$ 倍くらいと考えると、解生成は C++ なら十分間に合う確認ができる(pythonだとやや厳しい)。
全体としてはソート部分が支配的で、$O(MN\log M)$。

入力例1での動作

入力を受け取る。

n: 3
k: 8

$A_1+2A_2+3A_3=8$ を満たす列をすべて求める。

まず、最も大きい $3$ を何個使うか決める。

こうして得た $10$ 個の列を辞書順にソートすると、次のようになる。

0 1 2
0 4 0
1 2 1
2 0 2
2 3 0
3 1 1
4 2 0
5 0 1
6 1 0
8 0 0

注意点

探索は、大きい方からやること。
小さい方からやると、ハズレの枝が多すぎて間に合わない。
大きい方からやれば、探索の枝刈りは不要である。
というか、この探索方法ならどう進んでも必ず最後に $1$ での帳尻合わせが可能。
よって、刈れる枝がなく、無駄が一切ない最速の探索になっている。

別解

特になし。