整除分块

作用

\(O\left(\sqrt{n}\right)\)的时间复杂度内,计算类似\(\sum\limits_{i=1}^{n}f\left(i\right)\left\lfloor\frac{n}{i}\right\rfloor\)的式子

符号约定

\(\left\lfloor x\right\rfloor\)\(x\)下取整。
\(\left\{x\right\}\)\(x\)的小数部分。
显然,对于\(\forall x\ge 0,x\in\mathbb{Q}\),有\(x=\left\lfloor x \right\rfloor+\left\{x\right\}\)
\(\left|V\right|\):集合\(V\)的元素个数,称为集合的阶。

引理证明

引理\(1\)

\(\forall n\in\mathbb{N_{+}},\left|\left\{\left\lfloor\frac{n}{d}\right\rfloor\mid d\in\mathbb{N_{+}},d\le n\right\}\right|\le\left\lfloor2\sqrt{n}\right\rfloor\)
\(d\le \left\lfloor\sqrt{n}\right\rfloor\)时,\(\left\lfloor\frac{n}{d}\right\rfloor\)\(\left\lfloor\sqrt{n}\right\rfloor\)种取值。
\(d>\left\lfloor\sqrt{n}\right\rfloor\)时,\(\left\lfloor\frac{n}{d}\right\rfloor\)\(\left\lfloor\sqrt{n}\right\rfloor\)种取值。

结论

对于常数\(n\),使\(\left\lfloor\frac{n}{j}\right\rfloor=\left\lfloor\frac{n}{i}\right\rfloor\)成立的使\(i\le j\le n\)的最大值是\(\left\lfloor\frac{n}{\left\lfloor\frac{n}{i}\right\rfloor}\right\rfloor\)
证明:
\(\left\lfloor\frac{n}{i}\right\rfloor=k\),则\(n=ki+p(0\le p<i)\),再设\(\left\lfloor\frac{n}{i+d}\right\rfloor=k\),则\(n=k\left(i+d\right)+p'\)
综上,\(ki+p=k(i+d)+p'\)
\(\therefore p'=p-kd\)
\(\therefore d_{max}=\left\lfloor\frac{p}{k}\right\rfloor\)
\(\begin{array}{l}\therefore(i+d)_{max}\\ =i+d_{max}\\ =i+\left\lfloor\frac{p}{k}\right\rfloor\\ =i+\left\lfloor\frac{n\ mod\ i}{\left\lfloor\frac{n}{i}\right\rfloor}\right\rfloor\\ =i+\left\lfloor\frac{n-\left\lfloor\frac{n}{i}\right\rfloor i}{\left\lfloor\frac{n}{i}\right\rfloor}\right\rfloor\\ =\left\lfloor i+\frac{n-\left\lfloor\frac{n}{i}\right\rfloor i}{\left\lfloor\frac{n}{i}\right\rfloor}\right\rfloor\\ =\left\lfloor \frac{\left\lfloor\frac{n}{i}\right\rfloor i}{\left\lfloor\frac{n}{i}\right\rfloor}+\frac{n-\left\lfloor\frac{n}{i}\right\rfloor i}{\left\lfloor\frac{n}{i}\right\rfloor}\right\rfloor\\ =\left\lfloor\frac{n}{\left\lfloor\frac{n}{i}\right\rfloor}\right\rfloor\\ \end{array}\)

算法实现

先计算\(f\)数组前缀和,记为\(s\left[i\right]\)
利用分块的思想,将\(\left[l=i,r=\left\lfloor\frac{n}{\left\lfloor\frac{n}{i}\right\rfloor}\right\rfloor\right]\)放在一块,因为上面的结论,这一块的区间和为\(\sum\limits_{i=l}^{r}f\left(i\right)\left\lfloor\frac{n}{\left\lfloor\frac{n}{i}\right\rfloor}\right\rfloor=\left(s\left[r\right]-s\left[l-1\right]\right)\times\left\lfloor\frac{n}{\left\lfloor\frac{n}{i}\right\rfloor}\right\rfloor\),显然可\(O\left(1\right)\)得到。
由引理\(1\)得,时间复杂度为\(O\left(\sqrt{n}\right)\)
\(Code:\)

int res=0;
for(int i=1,j;i<=n;i=j+1){
        j=n/(n/i);
	res+=(s[r]-s[i-1])*(n/i);
}

拓展

事实上,这个可以拓展到多维的情况。
数论分块本质上是把值相同的情况打包计算,所以在各种右端点中,取最小值就可以保证都相等。

posted @ 2022-12-19 13:40  |Roland|  阅读(44)  评论(0)    收藏  举报