算法笔记——数论分块

1 1 个式子

对于这样一个式子:

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

我们可以分段求和,我们发现 n i \lfloor \frac{n}{i}\rfloor 一共就只有 n \sqrt{n} 种取值,所以,我们可以根据每种取值已经这种取值的次数,算出对答案的贡献,从而得到答案。

for(int l=1,r;l<=n;l=r+1){
	r=n/(n/l);//计算这种取值的右边界
	ans+=(r-l+1)*(n/l);
}

2 2 个式子

对于这样一个式子:

i = 1 min ( a , b ) n i m i \sum_{i=1}^{\min(a,b)}\lfloor \frac{n}{i}\rfloor \lfloor \frac{m}{i}\rfloor

跟上面同理,这个式子我们会去数论分块,大家可以结合代码理解,我就不详细讲了。

for(int l=1,r;l<=min(n,m);l=r+1){
	r=min(n/(n/l),m/(m/l));//计算这种取值的右边界
	ans+=(r-l+1)*(n/l)*(m/l);
}
原创文章 134 获赞 238 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_46230164/article/details/105934495
今日推荐