普通に計算したらO(N)O(N)で間に合わないので、工夫が必要です。

k>N2k>\frac{N}{2}ならばNk=1,N3<kN2\lfloor\frac{N}{k}\rfloor=1,\frac{N}{3}<k\leq\frac{N}{2}ならばNk=2,\lfloor\frac{N}{k}\rfloor=2,\cdotsとなるので、kkが大きいところではNk\lfloor\frac{N}{k}\rfloorの値の変化は少ないです。そこで、Nk\lfloor\frac{N}{k}\rfloorの値が同じになるkkをまとめて考えます。

mm11以上NN以下の自然数とすると、Nk=m\lfloor\frac{N}{k}\rfloor=mの時mNk<m+1m\leq\frac{N}{k}<m+1よりNm+1<kNm\frac{N}{m+1}<k\leq\frac{N}{m}となります。よって、Nk=m\lfloor\frac{N}{k}\rfloor=mとなるkkの数はNmNm+1\lfloor\frac{N}{m}\rfloor-\lfloor\frac{N}{m+1}\rfloorとなります。しかし、1mN1\leq m\leq Nなので、この方法のみで計算した場合もO(N)O(N)で間に合いません。

そこで、1kB1\leq k\leq Bではナイーブな方法、B<kNB<k\leq Nでは上で述べた方法を使います。B<kNB<k\leq NでのNk\lfloor\frac{N}{k}\rfloorの最大値はおよそNB\frac{N}{B}なので、総計算量はおよそB+NBB+\frac{N}{B}となり、この値は相加相乗平均の不等式よりB=NB=\sqrt{N}で最小値2N2\sqrt{N}をとります。よって、BBN\sqrt{N}付近の値にして上記の計算をすれば、O(N)O(\sqrt{N})で解を求められます。(平方分割)なお、解のオーダーはO(NlogN)O(N\log N)なので、6464ビット整数を使えばオーバーフローの心配はありません。

質問・誤りがある場合

Twitterに連絡ください。ID : @YS55749378