标签:lan 枚举 mat 一起 解决 因此 code 前言 莫比乌斯反演
一个常常与莫比乌斯反演一起使用的技巧,单独使用也有一定用武之地。
整除分块用以解决以下问题:
失去算法,失去很多;失去暴力,失去一切
暴力是显然的,照着公式打一遍就好。
for(int i=1;i<=n;++i) ans+=(n/i);
这暴力的过程中发现:虽然\(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