数论分块原理
数论分块模板题: ,采用数论分块可以优化到
。
为书写方便以下都写做n/i
首先我们要知道这一点:存在一些连续的x1,x2...xk,有n/x1=n/x2=...=n/xk。比如100/34=100/35=100/36=...=100/50。对于这些连续出现的,我们只需要知道出现次数,然后只用计算其中一个数就可以了,比如:(n/x1)*(xk-x1+1)。
现在要找出n,x1和xk的关系。
下图用数轴描述了i和n/i的部分取值。其中
n/(i-b)=n/(i-b+1)=n/(i-b+2)=...=n/(i-1)=k+L;
n/i=n/(i+1)=n/(i+2)=...=n/(i+a) =k;
n/(i+a+1)=n/(i+a+2)=...n/(i+a+c) =k-r;
由上图还可得出:
n-(i-1)<(k+L)*(i-1)<=n
n-i < k*i <= n
n-(i+a+1)<(k-r)*(i+a+1)<=n
(结合下图看会比较直观)
由于:n-i < k*i <= n
左右同时加上L*i得到:n-i+L*i < k*i+L*i <= n+L*i
合并同类项:n+(L-1)*i < (k+L)*i <= n+L*i
由于L>=1则:n< (k+L)*i
那么n/(k+L)<i
由于n-(i-1)<(k+L)*(i-1)<=n
那么n/(k+L)>=i-1
得:n/(k+L)=i-1
有了这个现在就好办了,结合上图我们就得出从i-b开始,到n/(k+L),这些数除以n向下取整的值都为k+L,而n/(i-b)=k+L。
最后得到从i-b开始,到n/(n/(i-b)),这些数除以n向下取整的值都为n/(i-b)。
同理应用于其它数段。
代码改日补上。