算法笔记——数论分块

11 个式子

对于这样一个式子:

i=1nnisum_{i=1}^{n}lfloor frac{n}{i} floor

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

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

22 个式子

对于这样一个式子:

i=1min(a,b)nimisum_{i=1}^{min(a,b)}lfloor frac{n}{i} floor lfloor frac{m}{i} floor

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

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);
}
原文地址:https://www.cnblogs.com/zhaohaikun/p/12968785.html