码迷,mamicode.com
首页 > 其他好文 > 详细

整除分块

时间:2020-06-29 22:54:30      阅读:48      评论:0      收藏:0      [点我收藏+]

标签:lan   枚举   mat   一起   解决   因此   code   前言   莫比乌斯反演   

数论 整除分块

0.1 前言

一个常常与莫比乌斯反演一起使用的技巧,单独使用也有一定用武之地。

1.1 问题

整除分块用以解决以下问题:

\[\sum_{i=1}^{n} \lfloor \frac{n}{i} \rfloor \]

1.2 暴力法

失去算法,失去很多;失去暴力,失去一切

暴力是显然的,照着公式打一遍就好。

for(int i=1;i<=n;++i) ans+=(n/i);

1.3 整除分块

这暴力的过程中发现:虽然\(i\)的确是从\(1\)枚举到了\(n\),但是\(\lfloor \frac{n}{i} \rfloor\)的值其实极其有限,具体而言,只有\(2\sqrt n\)种。证明如下:

对于\(\frac{n}{i}\),的\(n\)\(i\)

\(i\leq \sqrt n\),显然\(\lfloor \frac{n}{i} \rfloor\)的个数不会超过\(\sqrt n\)

\(i> \sqrt n\),则\(\lfloor \frac{n}{i} \rfloor\)的取值不会超过\(\sqrt n\),因为\(\lfloor \frac{n}{i} \rfloor\)至大是\(\sqrt n\)

综上,结论成立φ(゜▽゜*)?

显然,思路更进一步:假如我们每一次都能确定一个极大的范围,范围内的整除结果都是特定值,那么只需至多转移\(2\sqrt n\)次。复杂度\(O(\sqrt n)\)

问题转换为:如何确定一个范围,使的整除结果是一个特定的值?

结论:\(i\to\lfloor\frac{n}{\lfloor \frac{n}{i}\rfloor} \rfloor\),是满足整除结果一致的极大范围。

证明:

\(i\)是左边界,则\(i‘\)是右边界,值是\(d=\frac{n}{i}\)

\(\frac{n}{i‘}=d \Rightarrow i‘=\lfloor \frac{n}{d} \rfloor\)

展开得\(\lfloor\frac{n}{\lfloor \frac{n}{i}\rfloor} \rfloor\)

因此,结论得证(??????)??

那么借用上述结论优化一下求值:

ll l=1,r;
for(l;l<=n;l=r+1){
	r=min(k/(k/l),min(n,k-1));
	ans+=(k/l)*(r-l+1)/2;	
}

终了╰( ̄ω ̄o)

整除分块

标签:lan   枚举   mat   一起   解决   因此   code   前言   莫比乌斯反演   

原文地址:https://www.cnblogs.com/ticmis/p/13210789.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!