Try   HackMD

No.1653 Squarefree
O(R1/3+(RL))

問題

https://yukicoder.me/problems/no/1653

解法

square-free でない数

x は整数
i,j
を使って
x=i2×j
と表すことができます。
i2×jR
のとき、適当な定数
r
を決めると、
ir
または
jR/r2
が成り立ちます。
ir
の範囲は
i
を、
jR/r2
の範囲は
j
をはじめに固定して探索します。

解析

Li2×jR となる
(i,j)
の個数は

O(i=1RLi2)=O((RL)ζ(2))=O(RL)

しかないことが重要です。

Li2×jR となる範囲は連続かつどちらかを固定すると
O(1)
で計算できる (←モデルによる) ので、計算量は、これと、はじめに固定する
i
の個数と、はじめに固定する
j
の個数で、
O((RL)+r+R/r2)

rΘ(R1/3) とすれば
O(R1/3+(RL))

実装

i を整数ではなく素数として、先に Atkin の篩で素数列挙をしてから前半をやると速い
後半は
j
を固定すると調べる必要のある
i
はこの制約下で高々
1
個である

i>r の範囲しか調べる必要がない。
i>r
のとき
(i+1)2i2=2i+1>2r+1
より、
2rRL
であれば高々
1
個。

C++, 15 ms https://yukicoder.me/submissions/692585