くるのプログラミング記録

プログラミングの感想とか解説とか。

D - Semi Common Multiple

AtCoder Beginner Contest 150 D - Semi Common Multiple
問題リンク
https://atcoder.jp/contests/abc150/tasks/abc150_d

問題文は割愛。

これ難しいね。

考察過程。

まず言われた通りに式変形。
A_i/2=B_iとすると
X=2pB_i+B_i=(2p+1)B_i
p=0,1,2,3,......なのでB_iの奇数倍がXになる。

適当にB_iを奇数倍して数を揃えるとそこからは簡単に求まりそう。

最大公約数っぽい?→B_iが1e9ぐらいまではありえるので、LCMがオーバーフローして無理

こういうときは素因数分解してLCMの素因数だけ求める→Nsqrt(A)が通らないので無理

てかそもそもLCM求めたとして奇数倍遷移でいける?→無理なときもある


あーこれは全探索系か?Xの値を決め打ち全探索→でかすぎて無理

エスパーか?サンプルエスパーなのか?→エスパーできません

とりあえず無理なパターンだけ弾く方針で、そうすると残りは簡単に求まったりするときがあるので

2,3,5とかだと無理だなあ……あ、これ偶数あるとき無理なのでは?→嘘でーす2,6,6とかだと全然作れる。

LCMとりつつLCMとの商を見て偶数なら弾く?(何を言ってるんだ)(コンテスト中は慌てがち)→実装

いやいや違うわ

うーん、てかそもそもLCMでかくなっちゃうからなー……あっM以下じゃん……!

全体のLCMを計算しつつMを超えたらそこで計算打ち切って0を出力でオッケー。
これだとLCMを計算する方針で進めれる。
発想も綺麗だし典型っぽいしABCだしこれ想定解でしょと進めていく。

奇数倍遷移でLCMにならないパターンはどうしようか
そもそも奇数×奇数=奇数、偶数×奇数=偶数、偶数×偶数=偶数
なので今回は奇数の元は奇数のLCMにしかなれない。
もっと言うと偶数の数を調整できない、
あーこれはBに含まれる素因数2の数が同じであることが必要っぽい。

なので最初に2べきの数計算してsetに突っ込んでサイズ確認しておく

LCMが求まったのであとはカウントするだけ
算数苦手だなあ……あーこれは単調性があるので二分探索

個数をnとすると(nは自然数)
{2(n-1)+1}LCM<=Mならokだね。めぐる式書くだけ。

提出→AC
よかったよかった。

難しくて緊張感のある400でした。

https://atcoder.jp/contests/abc150/submissions/9409237