📝

AtCoder Beginner Contest ABC414 解法メモ

に公開

文中で使用しているのは、PythonライクでAtCoderに最適な言語の1つNimです

ABC414

ABC414A - Streamer Takahashi

解法

リスナー毎に、
Xi<=L and R<=Yiであれば、答えに1を加えていけばよい
ACコード

ABC414B - String Too Long

解法

l.max>100 or l.sum>100であればToo Longと表示し、
そうでなければ、答えとなる文字列にci.repeat(li)を連結していけばよい
ACコード

メモ

オーバーフロー対策であるl.max>100を条件に入れずにRE

ABC414C - Palindromic in Both Bases

解法

十進法の回文となる数を列挙し、それがA進法でも回文となる場合足しこんでいくことを考える
Nの桁数をみて、その半分(($N).len.ceilDiv(2))の桁までの正の整数を列挙し、反転して繋げれば回文ができる
その際、そのまま繋げれば偶数桁の回文に、反転した後、2文字目以降を繋げれば、奇数桁の回文が生成できる
出来上がった後に、N以下かどうかのフィルターをかければよい
整数nA進数に変換するには、変換後の各桁を表すDeque aに対し、
while n>0: a.addFirst(n mod A); n=n div A
とすればよく、
a.toSeq==a.toSeq.reversed
であれば、A進数も回文、ということになる
ACコード

メモ

あらかじめN以下の回文を生成することにこだわってしまい、時間を溶かした

ABC414D - Transmission Mission

解法

家の座標XをHashSetに入れて重複をなくし、ソートしたものを考える
M=1なら、答えはすべての家を覆えばいいのでX.max-X.minとなる
次に、M=2なら、家の間隔が一番広いところを空けて、残りの範囲をカバーすればよいから、各家の間隔を配列dとすれば、
X.max-X.min-d.maxとなる
つまり、答えは、dを大きい方からM-1項除いて足し合わせた数となる
ACコード

メモ

公比-1の取り扱いに気付かない
rationalsやsortByItがすぐに浮かばず、遠回りした

ABC414E - Count A%B=C

解法

動かすときに、条件を満たす(a,b,c)の個数がどうなるか考えるべく、あるbで固定すると、
a<bだとa=cとなってしまうので、それを除いたb~Nの個数から、
c=0となる、b~Nの範囲のbの倍数の個数を引いたものになるとわかる
しかし、N\leqq 10^{12}のため、bに沿って計算していくわけにもいかない
前半は、b1~Nと動けば、初項N、最終項1の等差数列の和なので、一気に

\frac{(N+1)\times N}{2}
と計算できるが、
後半は、Nbで割った商、N div bが同じ値である区間をまとめて計算することを考える
入力例17は、4で割った商も5で割った商も6で割った商も7で割った商も1なので、商1\times 4個分4つ、c=0となる倍数がある、と計算する
実装としては商i=1から始めて、
i~Nまでの倍数の数N div iに、倍数の数が同じになるiの最後の数、N div (N div i)までのiの個数をかけたものを足し合わせる
iの最後の数+1を次のiの値にしてこれをNまで繰り返していけばよい(商列挙
このようにして得た後半を前半から引けば答えとなる
ACコード

メモ

商列挙のアイディアは出ない


反復学習にはmochiがおすすめ
全問入ったdeckはこちら

Discussion