--- tags: yukicoder --- # No.1653 Squarefree $O(R^{1/3} + (R - L))$ 解 ## 問題 https://yukicoder.me/problems/no/1653 ## 解法 square-free でない数 $x$ は整数 $i, j$ を使って $x = i^2 \times j$ と表すことができます。 $i^2 \times j ≤ R$ のとき、適当な定数 $r$ を決めると、$i ≤ r$ または $j ≤ R / r^2$ が成り立ちます。 $i ≤ r$ の範囲は $i$ を、$j ≤ R / r^2$ の範囲は $j$ をはじめに固定して探索します。 ## 解析 $L ≤ i^2 \times j ≤ R$ となる $(i, j)$ の個数は $$ O\left(\sum_{i = 1}^\infty\frac{R - L}{i^2}\right) = O((R - L) \zeta(2)) = O(R - L) $$ しかないことが重要です。 $L ≤ i^2 \times j ≤ R$ となる範囲は連続かつどちらかを固定すると $O(1)$ で計算できる (←モデルによる) ので、計算量は、これと、はじめに固定する $i$ の個数と、はじめに固定する $j$ の個数で、$O((R - L) + r + R/r^2)$ $r \in \Theta(R^{1/3})$ とすれば $O(R^{1/3} + (R - L))$ ## 実装 $i$ を整数ではなく素数として、先に Atkin の篩で素数列挙をしてから前半をやると速い 後半は $j$ を固定すると調べる必要のある $i$ はこの制約下で高々 $1$ 個である > $i > r$ の範囲しか調べる必要がない。$i > r$ のとき $(i + 1)^2 - i^2 = 2i + 1 > 2r + 1$ より、$2r ≥ R - L$ であれば高々 $1$ 個。 C++, 15 ms https://yukicoder.me/submissions/692585