AtCoder Grand Contest 038 C - LCMs
が与えられるので、 を求めるというシンプルな問題。はいずれもからを動くとしてよい。(tex: i = j]のときは簡単に計算できるので、後から引けばよい)
一般に、 という形式の値を求める場合、 が間に合わないなら、 の形にしたいなと思うのが定石である。
まず考えることとしては であろう。一般に最小公倍数よりも最大公約数のほうが考えやすい(気がしている)。
そこで、与えられた式を という形に表す、ということを考えよう。(この発想は解説を見た)
するとの係数(元の式では )に着目すると、 であるため、結局 を求めれば良いことがわかった。
この値であるが、これはいわゆる約数メビウス変換という式になっている。すべての に対して約数列挙して を求めることも可能といえば可能だが、定数倍高速化を頑張らないと無理であろう。ということで高速約数メビウス変換を使うことで時間内に収まる。この計算量はとおくと、だそうである。(詳しくは証明したことはない)
残るは の計算であるが、これはまずという値がyであるようなの数というものを計算しておこう。すると と計算できる。これをすべてのについて計算するには、で計算できる。
問題設定はシンプルなのに式変形が高速ゼータ/メビウス変換の勉強になるという良問。