C - Unexpressed Editorial by shakayami


ここでは、setを使わない解法について解説します。

まず、1は\(a^b\)の形で表すことはできません。 よって、\(2\leq k\leq N\)の範囲内で条件を満たすものを答えればよいです。

全体集合は\(N-1\)個の要素があります。ここから\(a^2\)の形で書けるものを引きます。個数については二分探索でもできますし、愚直に数えても問題ないです。

さらに\(a^3\)の形で書けるものを引きます。これについては\(a^2\)と同様です。

\(a^4\)で書ける形のものは\(a^2\)の形でも書けるので、これについてはさらに引く必要はありません。

\(a^5\)で書けるものについては引きます。

\(a^6\)の形で書けるものは、\(a^2\)の形でも書けるし、\(a^3\)の形でも書くことができます。つまり2回分引いてしまっていて、余計に引いてしまっているので足します。

以上を繰り返すと、答えは以下の通りになります。

\(cnt(b)\)\(2\leq a^b\leq N\)を満たす整数\(a\)の個数とします。このとき答えは

\[ans=\sum_{b=1}^{\infty}\mu(b)\cdot cnt(b)\]

ここで、\(\mu(b)\)メビウス関数です。

さらに、\(b\)の足す範囲は、\(2^b\leq N\)を満たす\(b\)まででOKです。それ以降では\(cnt(b)=0\)となるため考慮する必要がありません。

\(cnt(b)\)を求めるときには、\(b=1\)のときは別途処理して(\(cnt(1)=N-1\)となる!)、それ以外では愚直に数えると、計算量は \(O(N^{1/2}+N^{1/3}+\cdots+N^{\lfloor\log_{2}{N}\rfloor})\) となり、間に合います。

提出例(pypy)

posted:
last update: