2≤X≤106=Mとおきます。1からMの整数それぞれがいくつ約数を持つかを数えます。
任意の自然数nの約数がm個あることは、倍数にnのある自然数はm個ある、と言い換えられます。
そこで、以下の操作を行います。
- 長さMの配列cを作り、cxは整数xの約数の個数を保持する。
- 1≤x≤Mにおいて、cy (y=x,2x,...,rx)を1ずつ増やす。(rは、rx≤M<(r+1)xを満たします。)
この操作はO(MlogM)で行えます。
cを生成した後はcxの値ごとにxを分け、ki=cxを満たすxを昇順に並べた配列を二分探索することなどにより、制限時間内にこの問題を解くことができます。