算法笔记——数论分块

1 1 1 个式子

对于这样一个式子:

∑ i = 1 n ⌊ n i ⌋ \sum_{i=1}^{n}\lfloor \frac{n}{i}\rfloor i=1nin

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

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

2 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 i=1min(a,b)inim

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

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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值