整除分块学习笔记

参考资料

https://zhuanlan.zhihu.com/p/513784838

https://oi-wiki.org/math/number-theory/sqrt-decomposition/

常见化整除的公式

a   m o d   b = a − ⌊ a b ⌋ ∗ b ⌈ a b ⌉ = ⌊ a − 1 b ⌋ + 1 a\ mod\ b = a - \lfloor{\frac{a}{b}}\rfloor * b\\ \lceil \frac{a}{b}\rceil = \lfloor \frac{a - 1}{b}\rfloor + 1 a mod b=ababba=ba1+1

数论分块结论

对常数num,使得式子
⌊ n u m i ⌋ = ⌊ n u m j ⌋ \lfloor\frac{num}{i}\rfloor = \lfloor\frac{num}{j}\rfloor inum=jnum
成立的最大满足 i < = j < = n i<=j<= n i<=j<=n j j j 值为 $ \lfloor \frac{num}{\lfloor{\frac{num}{i}}\rfloor}\rfloor$

⌊ n u m i ⌋ \lfloor\frac{num}{i}\rfloor inum所在块的右端点为
⌊ n u m ⌊ n u m i ⌋ ⌋ \lfloor \frac{num}{\lfloor{\frac{num}{i}}\rfloor}\rfloor inumnum

应用

对形如
∑ i = s t e d f ( i ) ⌊ n u m i ⌋ \sum_{i = st}^{ed} f(i)\lfloor\frac{num}{i}\rfloor i=stedf(i)inum
的式子, ⌊ n u m i ⌋ \lfloor\frac{num}{i}\rfloor inum呈块状分布,若能线性求出 ∑ f ( i ) \sum f(i) f(i),那么复杂可以通过分块降到 O ( n ) O(\sqrt n) O(n )

代码

//计算区间[st,ed]式子值
int f(int l,int r)//若f(i) = i,求[l,r]内f(i)的和
{
    return r - l + 1;
}
int block(int st, int ed, int num) {
	int R = 0;//块的右边界
	int ans = 0;
	ed = min(ed, num);//大于num下整除都是0
	for (int i = st; i <= ed; i = R + 1) {
		R = min(ed,num / (num / i));  //该区间的最后一个数
		ans += f(i,R)*(num / i);//区间[i,L]的num/i 都是一个值
	}
	return ans;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值