算法学习笔记(21):数论分块

数论分块

大部分内容来源于OI-WIKI

引理1: foralla,b,cZ,abc=abc

引理2: ni 的取值有 O(n)

引理 1 可以把一些分母搬上去, 转化成引理 2 的形式。 考虑引理 2 的式子的性质, 这启发我们计算 ni
可以快速统计。

有一个结论: 取值为 nl 的最大的 i 等于 nnl

所以我们就可以这么算 ni

int Sum(int x) {
	int l = 1, r = 0, res = 0;
	while(l <= x) {
		r = x / (x / l);
		res += (r - l + 1) * (x / l);
		l = r + 1;
	}
	return res;
}

拓展的, 当我们需要计算 fi×ni时:

可以把 res += (r - l + 1) * (x / l); 替换成 res += (f[r] - f[l - 1]) * (x / l);

再拓展地: 取值为 nl 的最大的 in1n1l

不严谨的证明:

引理4: ni=n1i+1

证明: n1i+1=n1+ii, 考虑 i1i<1, 所以易得前面的式子成立。

所以 ni 分的块和 n1i 分的块一致。

n维数论分块

我们考虑二维, 计算 a1i+a2i。 我们要快速计算某一段 (l,r) 的值, 也就是我们需要 l=1ra1i+a2i, 中的 a1i 都相同, a2i 都相同。

所以 r 端点取 min(a1a1l,a1a2l)

posted @   qqrj  阅读(27)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Deepseek官网太卡,教你白嫖阿里云的Deepseek-R1满血版
· 2分钟学会 DeepSeek API,竟然比官方更好用!
· .NET 使用 DeepSeek R1 开发智能 AI 客户端
· DeepSeek本地性能调优
· 一文掌握DeepSeek本地部署+Page Assist浏览器插件+C#接口调用+局域网访问!全攻略
点击右上角即可分享
微信分享提示