AGC 026 B - rng_10s
とりあえず自明ケースを除いておく:
- A<BならNo
- B>DならNo
- 上記以外でB≤CならYes
それ以外の場合では、Noになるのは在庫の数Xが区間(C,B)に入ってしまう場合、つまり1回の購入量Bより小さく補充の閾値Cよりは大きい状態が発生してしまうケースである。これはXがmodBでC+1,C+2,...,B−1のいずれかと合同になる、と言い換えられる。
シミュレーションしながら考えてみる:
- 最初の在庫AがmodBでC+1,C+2,...,B−1のどれかと合同だとNo。
- A≡0,1,...,CmodBの場合はD個の補充に成功する。A+DがmodBでC+1,C+2,...,B−1のどれかと合同だとやはりNo。
- A+D≡0,1,...,CmodBの場合はさらにD個の補充に成功する。A+2DがmodBでC+1,C+2,...,B−1のどれかと合同だとやはりNo。
- …
というわけで、非負整数xが存在してA+DxがC+1,C+2,...,B−1のいずれかと合同の場合(∗)はNo、それ以外はYesとわかる。
これで解けたと思ったのだが、そこから先のやり方がよくわかっていないことに気づいて考えこんでしまった……
合同方程式を解く方法に立ち戻る。A+Dx≡dmodBを解くことはDx+By=d−Aを解くことと同じで、後者が可解であることはd−Aがgcd(B,D)の倍数であることと同値である。 したがって、条件(∗)はC+1−A,C+2−A,...,B−1−Aの中にgcd(B,D)の倍数が含まれる、と言い換えられる。これなら実装可能な判定方法になっている。つまり、gcd(B,D)の倍数でC+1−A以上であるような最小のものを求めてそれがB−A未満ならNo、そうでなければYesである。