Remainder Reminder

ARC091-D "Remainder Reminder"

あけましておめでとうございます.

提出コード

atcoder.jp

考察

下の図 1のような表を自分は書きました.

これは入力が

 10 \ 3

のときの表です.

見方としては, aを決めたときに条件を満たす bを右に書き並べていったものです.

なお,考察がしやすいよう N=10より大きい aも一部書いています.

( b=0を書き込む欄がありますが, 0割りに相当するのでありえないです.表を修正するのが面倒だったのです.)

f:id:chankilu23:20201231193358j:plain

 bを固定して考えてみます.(図では b=4, 6を取り上げてみました.)


 b=4のとき

上から順に a b=4で割った余りを見ていくと,

 1, 2, 3, 0, 1, 2, 3, 0, ...

と循環しているのがわかります.(当然ですが)

循環している塊ごとに赤枠で分けました.

一つの塊内には当然 4つの数字が存在します.

この赤枠内で条件を満たす aの数は, 4-3=1個です.

(  b=4個中 K=3個が条件を満たさないので )

そして N=10以下で繰り返しの赤枠の総数は, 10/4 = 2個です.

(  N=10個の整数を b=4個の塊ごとに見ているので )

よって,繰り返し分の中で条件を満たす aの個数は 1 \times 2 = 2個です.

もう一歩考えることがあるのですが, b=4では考えにくいので次にいきます.


 b=7のとき

上と同様に考えると,赤枠内で条件を満たす aの数は 7-3 = 4個.

繰り返しの赤枠の数は 10/7 = 1個.

よって,繰り返し分の中で条件を満たす aの個数は 4 \times 1 = 4個です.

 b=4では飛ばしたものを考えます.

図を見ればわかりますが,繰り返しが終わった後の赤枠(途中で途切れている)内にも残っているのが確認できます.

赤枠の繰り返しが終わったとき,残りの aの候補の数は 10 \% 7=3です.

このうち, 3-1=2個は条件を満たさないので,候補の数から引くことで, 3-2=1を得ます.

よって赤枠の繰り返し分と合わせて, b=7のときの条件を満たす aの数は 4+1=5です.


一般化します.

 bを固定したとき,赤枠の繰り返し数は, N/bです.

その各々に対して,赤枠内の条件を満たす aの数は b-K個です.

よって,繰り返し分の赤枠で考えると, N/b \times (b-K)個だけあります.

ただし, b-K \lt 0となることもあるので, N/b \times max  (0, b-K )とします.

残りは繰り返しからはみ出たやつらです.

残りの aの候補数は N \% bです.

そのうち, K-1個が条件を満たさないので, N \% b - (K-1)です.

ただし, N \% b - (K-1) \lt 0となることもあるので,max (0, N \% b - K + 1)とします.

これを b+1から Nまで順に足していけば O(N)で答えが出ます.


 K=0のときだけ上記の方法ではうまくいきません.

でも K=0では全ての組み合わせで条件を満たすので, N \times Nを出力すればOKです.

感想

年内にACはしていましたが忙しくて記事にはできませんでした.

なかなか面白い問題でしたね.

良いところまでは気づいていましたが,最後の細かい詰めは知り合いに助けてもらいました.

整数の問題は好きなので得意になりたいです.