ABC321 F - #(subset sum = K) with Add and Erase があの遷移でいい理由を理解する
わかっていてほしいもの
- 数 IA の多項式の四則演算
はじめに
ここでは多項式の実装等は扱わず、どうして遷移があのようになるかを取り扱います。また、わかりやすさのために厳密性を欠く記述があります。
本題
dp 配列と多項式を関連付けると嬉しい場合があります、これもそのうちの一つです。
最初からこの問題を考えると難しいので、箱から取り出すことがない場合を考えましょう。
すると、これは以下のように dp 配列を更新することで解けるはずです。
ここで、これを多項式によって書くことを考えます。
仮に、多項式の次数を に相当するもの、 の係数を の中身に相当するものとし、これをどう遷移させるかを考えます。
(具体的には という多項式です)
ここで考えていた dp は
と書き直すことができます。
一つ前の状態の和に だけ下駄をはかせたもの というのは、 一つ前の状態に を掛けたものに等しいです。
よって、次のように書けることがわかります。
この形のまま、箱から取り出すことがある場合を考えましょう。
問題文から、取り出される際に が を因数に持つことがわかります。
ここで多項式は乗法について可換ですから、 の一番右に をもってきて、 で割って打ち消してしまいましょう。
直感的に乗算と除算は逆の演算ですから、dp として扱う際も逆の操作をすればよさそうです。
したがって、取り出すときの更新は以下のように書けます
よって、この遷移を実装して、 時間でこの問題を解くことが出来ました。
(FPS を用いた提出:提出 #45905788 - サントリープログラミングコンテスト2023(AtCoder Beginner Contest 321))
(dp での提出:https://atcoder.jp/contests/abc321/submissions/45925519)