--- 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
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.