hitoare日記

たまに書きます

E - Sum of gcd of Tuples (Hard) (AtCoder Beginner Contest 162)

問題リンク

atcoder.jp


問題概要

正整数\(K,N\)が与えられる。

1以上\(K\)以下の自然数からなる数列\(A_1,...,A_N\)は\(K^N\)通りあるが、それらに対し

\(gcd(A_1,...,A_N)\)の総和を求めよ。

解法

自分は約数包除を使った。

\(f(d)\)を1以上\(K\)以下の自然数からなるgcdが\(d\)の数列の個数とすると、求める答えは

\( \sum_{d=1}^{K}d \times f(d)\)で表される。

ここで\(K\)以下の\(d\)の倍数のみからなる数列全体を考えると

\({\lfloor \frac{K}{d} \rfloor }^N = \sum_{t=1}^{K/d} f(dt)\)

が成り立つ。

よってメビウス変換によりメビウス関数(\(\mu(t)\)を使って

\(f(d) = \sum_{t=1}^{K/d} {\lfloor \frac{K}{dt} \rfloor }^N \mu(t)\)

この式から\(f(d)\)を小さい\(d\)から順に求めた後に和を求めればよい。

計算量は\(O(KlogK)\)になる。

提出

https://atcoder.jp/contests/abc162/submissions/11832281

感想

難しく考えすぎたかも…